logutil

package module
v1.2.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2025 License: MIT Imports: 12 Imported by: 3

README

logutil

PotatoBeans standard logging library for all PotatoBeans services. Now published as open source for all users and PotatoBeans former clients to use and import.

logutil library provides a Logger interface and some additional default implementations for logging. Although not designed for speed, the library can be further extended to acknowledge other common logging methods, including some quick ones. The library is not restricted to not use cgo too and so C languages can be used when needed to create some more quick loggers.

Compared to the rest of logging libraries out there, logutil does not provide much more features. It provides a basic interface to log into a few outputs, with 5 log levels: TRACE, DEBUG, INFO, WARN, and ERROR. The new logutil.ContextLogger interface adds context support, which is useful for OpenTelemetry logging, which is also supported.

Usage

The example below creates a function that reads from config (can be parsed with potatobeansco/go-config). The MultiLogger provides a basic way to send to multiple logger all at once. The MultiLogger sends logs to all the logutil.ContextLogger outputs, allowing you to log into multiple outputs. The standard example below logs to stdoutput, a file, and OpenTelemetry LoggerProvider in case it is given.

type Config struct {
    LoggingToStd    bool   `config:"LOGGING_TO_STD"`
    LoggingStdColor bool   `config:"LOGGING_STD_COLOR"`
    LoggingToFile   bool   `config:"LOGGING_TO_FILE"`
    LoggingFilePath string `config:"LOGGING_FILE_PATH"`
}

func createLogger(loggingConfig *Config, prefix string, logProvider *sdklog.LoggerProvider) logutil.ContextLogger {
	var loggers []logutil.ContextLogger

	if loggingConfig.LoggingToStd {
		logger := logutil.NewStdLogger(loggingConfig.LoggingStdColor, prefix)
		logger.OutputMode = logutil.StdLoggerOutputModeOnlyStdOut
		loggers = append(loggers, logger)
	}

	if loggingConfig.LoggingToFile {
		loggers = append(loggers, logutil.NewFileLogger(loggingConfig.LoggingFilePath, prefix))
	}

	if logProvider != nil {
		loggers = append(loggers, logutil.NewOpenTelemetryLogger(logProvider, prefix, version))
	}

	return logutil.NewMultiLogger(loggers...)
}

The result is a ContextLogger which can be used everywhere in your code. You can create different logger with different prefixes for different use cases. Prefixes show up in standard output and file, such as (myservice):

2025/03/10 13:58:16 [ERROR ] myservice: cannot ping database: failed to connect to 127.0.0.1:5432

Prefix is also sent as attribute (prefix) for OpenTelemetry log, in addition to the custom kind attribute which can be log or access.

Currently, the supported Logger in this repository are:

  • FileLogger (to file)
  • StdLogger (to stdout/stderr)
  • FluentdLogger (to fluentd in_udp or in_tcp inputs)
  • OpenTelemetryLogger (to OpenTelemetry log provider)

All of these loggers support context parameters. However, it is only the OpenTelemetryLogger that so far uses it. OpenTelemetryLogger can capture trace parent data from its context, to provide Trace to Log or Log to Trace functionalities, such as the ones provided by Grafana and other services.

Documentation

Index

Constants

View Source
const (
	StdLoggerOutputModeDefault = iota
	StdLoggerOutputModeOnlyStdOut
	StdLoggerOutputModeOnlyStdErr
)
View Source
const (
	PrefixTrace        = "TRACE "
	PrefixTraceColor   = "\x1b[37;1mTRACE \x1b[0m"
	PrefixDebug        = "DEBUG "
	PrefixDebugColor   = "\x1b[34;1mDEBUG \x1b[0m"
	PrefixInfo         = "INFO  "
	PrefixInfoColor    = "\x1b[36;1mINFO  \x1b[0m"
	PrefixWarning      = "WARN  "
	PrefixWarningColor = "\x1b[33;1mWARN  \x1b[0m"
	PrefixFatal        = "ERROR "
	PrefixFatalColor   = "\x1b[31;1mERROR \x1b[0m"
	PrefixAccess       = "ACCESS"
	PrefixAccessColor  = "\x1b[35;1mACCESS\x1b[0m"
)
View Source
const (
	// LevelTrace configures log output up to TRACE level.
	LevelTrace = iota
	// LevelDebug configures log output up to DEBUG level.
	// Access logs are the same as DEBUG logs, and so will only be written when logger is configured with LevelDebug.
	LevelDebug
	// LevelInfo configures log output up to INFO level.
	LevelInfo
	// LevelWarn configures log output up to WARN level.
	LevelWarn
	// LevelFatal configures log output up to ERROR level.
	LevelFatal
	// LevelNone configures log output so no log is written.
	LevelNone
)

Variables

This section is empty.

Functions

func Access

func Access(message string)

Access outputs an access message with the default logger.

func Debug

func Debug(message string)

Debug outputs a debug message with the default logger.

func Debugf

func Debugf(format string, v ...interface{})

Debugf outputs a debug formatted message with the default logger.

func Error

func Error(message string)

Error outputs an error message with the default logger.

func Errorf

func Errorf(format string, v ...interface{})

Errorf outputs an error formatted message with the default logger.

func Info

func Info(message string)

Info outputs a info message with the default logger.

func Infof

func Infof(format string, v ...interface{})

Infof outputs a info formatted message with the default logger.

func IsSupportColor

func IsSupportColor() bool

IsSupportColor checks whether the terminal supports color.

func SetDefaultLogger

func SetDefaultLogger(logger Logger)

SetDefaultLogger replaces the default logger with new logger.

func Trace

func Trace(message string)

Trace outputs a trace message with the default logger.

func Tracef

func Tracef(format string, v ...interface{})

Tracef outputs a trace formatted message with the default logger.

func Warn

func Warn(message string)

Warn outputs a warning message with the default logger.

func Warnf

func Warnf(format string, v ...interface{})

Warnf outputs a warning formatted message with the default logger.

Types

type AccessLogger

type AccessLogger interface {
	Access(message string)
}

type AccessLoggerWriter

type AccessLoggerWriter struct {
	Logger AccessLogger
}

AccessLoggerWriter implements io.Writer. It is designed to be used in conjunction with github.com/gorilla/handlers (handlers.LoggingHandler) to log API access activities. handlers.LoggingHandler requires an io.Writer. This writer will pass the written message to an AccessLogger.

func (*AccessLoggerWriter) Write

func (a *AccessLoggerWriter) Write(p []byte) (n int, err error)

type ContextLogger

type ContextLogger interface {
	Logger

	TraceCtx(ctx context.Context, message string)
	TracefCtx(ctx context.Context, format string, v ...interface{})
	DebugCtx(ctx context.Context, message string)
	DebugfCtx(ctx context.Context, format string, v ...interface{})
	InfoCtx(ctx context.Context, message string)
	InfofCtx(ctx context.Context, format string, v ...interface{})
	WarnCtx(ctx context.Context, message string)
	WarnfCtx(ctx context.Context, format string, v ...interface{})
	ErrorCtx(ctx context.Context, message string)
	ErrorfCtx(ctx context.Context, format string, v ...interface{})
	AccessCtx(ctx context.Context, message string)
}

type FileLogger

type FileLogger struct {
	Prefix        string
	Level         int
	EscapeNewLine bool
	// contains filtered or unexported fields
}

FileLogger output logs into a file.

func NewFileLogger

func NewFileLogger(filepath, prefix string) *FileLogger

NewFileLogger creates a FileLogger that outputs logs to file pointed by filepath. If filepath does not exist, it will be created. If the directory does not exist,

func (*FileLogger) Access

func (fileLogger *FileLogger) Access(message string)

func (*FileLogger) AccessCtx

func (fileLogger *FileLogger) AccessCtx(_ context.Context, message string)

func (*FileLogger) Close

func (fileLogger *FileLogger) Close() error

func (*FileLogger) Debug

func (fileLogger *FileLogger) Debug(message string)

func (*FileLogger) DebugCtx

func (fileLogger *FileLogger) DebugCtx(_ context.Context, message string)

func (*FileLogger) Debugf

func (fileLogger *FileLogger) Debugf(format string, v ...interface{})

func (*FileLogger) DebugfCtx

func (fileLogger *FileLogger) DebugfCtx(_ context.Context, format string, v ...interface{})

func (*FileLogger) Error

func (fileLogger *FileLogger) Error(message string)

func (*FileLogger) ErrorCtx

func (fileLogger *FileLogger) ErrorCtx(_ context.Context, message string)

func (*FileLogger) Errorf

func (fileLogger *FileLogger) Errorf(format string, v ...interface{})

func (*FileLogger) ErrorfCtx

func (fileLogger *FileLogger) ErrorfCtx(_ context.Context, format string, v ...interface{})

func (*FileLogger) Info

func (fileLogger *FileLogger) Info(message string)

func (*FileLogger) InfoCtx

func (fileLogger *FileLogger) InfoCtx(_ context.Context, message string)

func (*FileLogger) Infof

func (fileLogger *FileLogger) Infof(format string, v ...interface{})

func (*FileLogger) InfofCtx

func (fileLogger *FileLogger) InfofCtx(_ context.Context, format string, v ...interface{})

func (*FileLogger) SetVerbosity

func (fileLogger *FileLogger) SetVerbosity(level int)

func (*FileLogger) Trace

func (fileLogger *FileLogger) Trace(message string)

func (*FileLogger) TraceCtx

func (fileLogger *FileLogger) TraceCtx(_ context.Context, message string)

func (*FileLogger) Tracef

func (fileLogger *FileLogger) Tracef(format string, v ...interface{})

func (*FileLogger) TracefCtx

func (fileLogger *FileLogger) TracefCtx(_ context.Context, format string, v ...interface{})

func (*FileLogger) Warn

func (fileLogger *FileLogger) Warn(message string)

func (*FileLogger) WarnCtx

func (fileLogger *FileLogger) WarnCtx(_ context.Context, message string)

func (*FileLogger) Warnf

func (fileLogger *FileLogger) Warnf(format string, v ...interface{})

func (*FileLogger) WarnfCtx

func (fileLogger *FileLogger) WarnfCtx(_ context.Context, format string, v ...interface{})

type FluentdLogger

type FluentdLogger struct {
	Prefix        string
	Level         int
	Tag           string
	EscapeNewLine bool
	// contains filtered or unexported fields
}

func NewFluentdLogger

func NewFluentdLogger(config *FluentdLoggerConfig, prefix, tag string) (*FluentdLogger, error)

func (*FluentdLogger) Access

func (fl *FluentdLogger) Access(message string)

func (*FluentdLogger) AccessCtx

func (fl *FluentdLogger) AccessCtx(_ context.Context, message string)

func (*FluentdLogger) Close

func (fl *FluentdLogger) Close() (err error)

func (*FluentdLogger) Debug

func (fl *FluentdLogger) Debug(message string)

func (*FluentdLogger) DebugCtx

func (fl *FluentdLogger) DebugCtx(_ context.Context, message string)

func (*FluentdLogger) Debugf

func (fl *FluentdLogger) Debugf(format string, v ...interface{})

func (*FluentdLogger) DebugfCtx

func (fl *FluentdLogger) DebugfCtx(_ context.Context, format string, v ...interface{})

func (*FluentdLogger) Error

func (fl *FluentdLogger) Error(message string)

func (*FluentdLogger) ErrorCtx

func (fl *FluentdLogger) ErrorCtx(_ context.Context, message string)

func (*FluentdLogger) Errorf

func (fl *FluentdLogger) Errorf(format string, v ...interface{})

func (*FluentdLogger) ErrorfCtx

func (fl *FluentdLogger) ErrorfCtx(_ context.Context, format string, v ...interface{})

func (*FluentdLogger) Info

func (fl *FluentdLogger) Info(message string)

func (*FluentdLogger) InfoCtx

func (fl *FluentdLogger) InfoCtx(_ context.Context, message string)

func (*FluentdLogger) Infof

func (fl *FluentdLogger) Infof(format string, v ...interface{})

func (*FluentdLogger) InfofCtx

func (fl *FluentdLogger) InfofCtx(_ context.Context, format string, v ...interface{})

func (*FluentdLogger) SetVerbosity

func (fl *FluentdLogger) SetVerbosity(level int)

func (*FluentdLogger) Trace

func (fl *FluentdLogger) Trace(message string)

func (*FluentdLogger) TraceCtx

func (fl *FluentdLogger) TraceCtx(_ context.Context, message string)

func (*FluentdLogger) Tracef

func (fl *FluentdLogger) Tracef(format string, v ...interface{})

func (*FluentdLogger) TracefCtx

func (fl *FluentdLogger) TracefCtx(_ context.Context, format string, v ...interface{})

func (*FluentdLogger) Warn

func (fl *FluentdLogger) Warn(message string)

func (*FluentdLogger) WarnCtx

func (fl *FluentdLogger) WarnCtx(_ context.Context, message string)

func (*FluentdLogger) Warnf

func (fl *FluentdLogger) Warnf(format string, v ...interface{})

func (*FluentdLogger) WarnfCtx

func (fl *FluentdLogger) WarnfCtx(_ context.Context, format string, v ...interface{})

type FluentdLoggerConfig

type FluentdLoggerConfig fluent.Config

type Logger

type Logger interface {
	Trace(message string)
	Tracef(format string, v ...interface{})
	Debug(message string)
	Debugf(format string, v ...interface{})
	Info(message string)
	Infof(format string, v ...interface{})
	Warn(message string)
	Warnf(format string, v ...interface{})
	Error(message string)
	Errorf(format string, v ...interface{})
	SetVerbosity(level int)
	Close() error

	AccessLogger
}

type MultiLogger

type MultiLogger struct {
	// contains filtered or unexported fields
}

MultiLogger allows you to log to multiple Logger at once.

func NewMultiLogger

func NewMultiLogger(loggers ...ContextLogger) *MultiLogger

NewMultiLogger creates a new MultiLogger logging to each of the Logger given as the parameter.

func (*MultiLogger) Access

func (multiLogger *MultiLogger) Access(message string)

func (*MultiLogger) AccessCtx

func (multiLogger *MultiLogger) AccessCtx(ctx context.Context, message string)

func (*MultiLogger) Close

func (multiLogger *MultiLogger) Close() error

func (*MultiLogger) Debug

func (multiLogger *MultiLogger) Debug(message string)

func (*MultiLogger) DebugCtx

func (multiLogger *MultiLogger) DebugCtx(ctx context.Context, message string)

func (*MultiLogger) Debugf

func (multiLogger *MultiLogger) Debugf(format string, v ...interface{})

func (*MultiLogger) DebugfCtx

func (multiLogger *MultiLogger) DebugfCtx(ctx context.Context, format string, v ...interface{})

func (*MultiLogger) Error

func (multiLogger *MultiLogger) Error(message string)

func (*MultiLogger) ErrorCtx

func (multiLogger *MultiLogger) ErrorCtx(ctx context.Context, message string)

func (*MultiLogger) Errorf

func (multiLogger *MultiLogger) Errorf(format string, v ...interface{})

func (*MultiLogger) ErrorfCtx

func (multiLogger *MultiLogger) ErrorfCtx(ctx context.Context, format string, v ...interface{})

func (*MultiLogger) Info

func (multiLogger *MultiLogger) Info(message string)

func (*MultiLogger) InfoCtx

func (multiLogger *MultiLogger) InfoCtx(ctx context.Context, message string)

func (*MultiLogger) Infof

func (multiLogger *MultiLogger) Infof(format string, v ...interface{})

func (*MultiLogger) InfofCtx

func (multiLogger *MultiLogger) InfofCtx(ctx context.Context, format string, v ...interface{})

func (*MultiLogger) SetVerbosity

func (multiLogger *MultiLogger) SetVerbosity(level int)

func (*MultiLogger) Trace

func (multiLogger *MultiLogger) Trace(message string)

func (*MultiLogger) TraceCtx

func (multiLogger *MultiLogger) TraceCtx(ctx context.Context, message string)

func (*MultiLogger) Tracef

func (multiLogger *MultiLogger) Tracef(format string, v ...interface{})

func (*MultiLogger) TracefCtx

func (multiLogger *MultiLogger) TracefCtx(ctx context.Context, format string, v ...interface{})

func (*MultiLogger) Warn

func (multiLogger *MultiLogger) Warn(message string)

func (*MultiLogger) WarnCtx

func (multiLogger *MultiLogger) WarnCtx(ctx context.Context, message string)

func (*MultiLogger) Warnf

func (multiLogger *MultiLogger) Warnf(format string, v ...interface{})

func (*MultiLogger) WarnfCtx

func (multiLogger *MultiLogger) WarnfCtx(ctx context.Context, format string, v ...interface{})

type OpenTelemetryLogger

type OpenTelemetryLogger struct {
	Prefix string
	Level  int
	// contains filtered or unexported fields
}

func NewOpenTelemetryLogger

func NewOpenTelemetryLogger(provider otellog.LoggerProvider, name, version string) *OpenTelemetryLogger

func (*OpenTelemetryLogger) Access

func (o *OpenTelemetryLogger) Access(message string)

func (*OpenTelemetryLogger) AccessCtx

func (o *OpenTelemetryLogger) AccessCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Close

func (o *OpenTelemetryLogger) Close() error

func (*OpenTelemetryLogger) Debug

func (o *OpenTelemetryLogger) Debug(message string)

func (*OpenTelemetryLogger) DebugCtx

func (o *OpenTelemetryLogger) DebugCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Debugf

func (o *OpenTelemetryLogger) Debugf(format string, v ...interface{})

func (*OpenTelemetryLogger) DebugfCtx

func (o *OpenTelemetryLogger) DebugfCtx(ctx context.Context, format string, v ...interface{})

func (*OpenTelemetryLogger) Error

func (o *OpenTelemetryLogger) Error(message string)

func (*OpenTelemetryLogger) ErrorCtx

func (o *OpenTelemetryLogger) ErrorCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Errorf

func (o *OpenTelemetryLogger) Errorf(format string, v ...interface{})

func (*OpenTelemetryLogger) ErrorfCtx

func (o *OpenTelemetryLogger) ErrorfCtx(ctx context.Context, format string, v ...interface{})

func (*OpenTelemetryLogger) Info

func (o *OpenTelemetryLogger) Info(message string)

func (*OpenTelemetryLogger) InfoCtx

func (o *OpenTelemetryLogger) InfoCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Infof

func (o *OpenTelemetryLogger) Infof(format string, v ...interface{})

func (*OpenTelemetryLogger) InfofCtx

func (o *OpenTelemetryLogger) InfofCtx(ctx context.Context, format string, v ...interface{})

func (*OpenTelemetryLogger) SetVerbosity

func (o *OpenTelemetryLogger) SetVerbosity(level int)

func (*OpenTelemetryLogger) Trace

func (o *OpenTelemetryLogger) Trace(message string)

func (*OpenTelemetryLogger) TraceCtx

func (o *OpenTelemetryLogger) TraceCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Tracef

func (o *OpenTelemetryLogger) Tracef(format string, v ...interface{})

func (*OpenTelemetryLogger) TracefCtx

func (o *OpenTelemetryLogger) TracefCtx(ctx context.Context, format string, v ...interface{})

func (*OpenTelemetryLogger) Warn

func (o *OpenTelemetryLogger) Warn(message string)

func (*OpenTelemetryLogger) WarnCtx

func (o *OpenTelemetryLogger) WarnCtx(ctx context.Context, message string)

func (*OpenTelemetryLogger) Warnf

func (o *OpenTelemetryLogger) Warnf(format string, v ...interface{})

func (*OpenTelemetryLogger) WarnfCtx

func (o *OpenTelemetryLogger) WarnfCtx(ctx context.Context, format string, v ...interface{})

type StdLogAdapter

type StdLogAdapter struct {
	Logger Logger
}

func (*StdLogAdapter) Write

func (adapter *StdLogAdapter) Write(p []byte) (n int, err error)

type StdLogger

type StdLogger struct {
	Color         bool
	Prefix        string
	Level         int
	OutputMode    int
	EscapeNewLine bool
	// contains filtered or unexported fields
}

func NewStdLogger

func NewStdLogger(color bool, prefix string) *StdLogger

func (*StdLogger) Access

func (stdLogger *StdLogger) Access(message string)

func (*StdLogger) AccessCtx

func (stdLogger *StdLogger) AccessCtx(_ context.Context, message string)

func (*StdLogger) Close

func (stdLogger *StdLogger) Close() error

func (*StdLogger) Debug

func (stdLogger *StdLogger) Debug(message string)

func (*StdLogger) DebugCtx

func (stdLogger *StdLogger) DebugCtx(_ context.Context, message string)

func (*StdLogger) Debugf

func (stdLogger *StdLogger) Debugf(format string, v ...interface{})

func (*StdLogger) DebugfCtx

func (stdLogger *StdLogger) DebugfCtx(_ context.Context, format string, v ...interface{})

func (*StdLogger) Error

func (stdLogger *StdLogger) Error(message string)

func (*StdLogger) ErrorCtx

func (stdLogger *StdLogger) ErrorCtx(_ context.Context, message string)

func (*StdLogger) Errorf

func (stdLogger *StdLogger) Errorf(format string, v ...interface{})

func (*StdLogger) ErrorfCtx

func (stdLogger *StdLogger) ErrorfCtx(_ context.Context, format string, v ...interface{})

func (*StdLogger) Info

func (stdLogger *StdLogger) Info(message string)

func (*StdLogger) InfoCtx

func (stdLogger *StdLogger) InfoCtx(_ context.Context, message string)

func (*StdLogger) Infof

func (stdLogger *StdLogger) Infof(format string, v ...interface{})

func (*StdLogger) InfofCtx

func (stdLogger *StdLogger) InfofCtx(_ context.Context, format string, v ...interface{})

func (*StdLogger) SetVerbosity

func (stdLogger *StdLogger) SetVerbosity(level int)

func (*StdLogger) Trace

func (stdLogger *StdLogger) Trace(message string)

func (*StdLogger) TraceCtx

func (stdLogger *StdLogger) TraceCtx(_ context.Context, message string)

func (*StdLogger) Tracef

func (stdLogger *StdLogger) Tracef(format string, v ...interface{})

func (*StdLogger) TracefCtx

func (stdLogger *StdLogger) TracefCtx(_ context.Context, format string, v ...interface{})

func (*StdLogger) Warn

func (stdLogger *StdLogger) Warn(message string)

func (*StdLogger) WarnCtx

func (stdLogger *StdLogger) WarnCtx(_ context.Context, message string)

func (*StdLogger) Warnf

func (stdLogger *StdLogger) Warnf(format string, v ...interface{})

func (*StdLogger) WarnfCtx

func (stdLogger *StdLogger) WarnfCtx(_ context.Context, format string, v ...interface{})

type Writer

type Writer struct {
	Ctx      context.Context
	Severity log.Severity
	Logger   ContextLogger
}

Writer implements io.Writer. This writer will pass the written message and its severity to a Logger.

func (*Writer) Write

func (w *Writer) Write(p []byte) (n int, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL