logadapter

package module
v1.1.0 Latest Latest
Warning

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

Go to latest
Published: Mar 20, 2024 License: MIT Imports: 18 Imported by: 2

README

go-logadapter

License GolangVersion Release Go Reference

go-logadapter provide a flexible and powerful way to handle logging in applications, and can help in debugging, monitoring, and maintaining the application's performance and behavior.

In Go, the logging package provides a simple logging interface for sending log messages to various outputs, such as the console or a file. However, it can be useful to have more advanced logging features, such as the ability to write logs to multiple destinations, format log messages differently based on severity or context, or filter logs based on certain criteria. To accomplish these more advanced logging features, we can use go-logadapter.

It's a piece of code that sits between the application and the logging package and modifies, enhances the way log messages are handled. It's customized to suit for Echo web framework , gorm and still updating.

Advantages of go-logadapter

  • Writing logs to multiple destinations, such as a file, console.
  • Formatting log messages such as JSON, pretty JSON, text.
  • Filtering logs based on certain criteria, such as log level, module, type, or request_id, correlation_id.
  • Suit specific application needs such as echo, gorm
  • Can help in debugging an application by providing detailed information about the application's behavior, performance, and errors.

Requirements

  • Go 1.18+

Getting Started

$ go get -u github.com/vuduongtp/go-logadapter

Import

import "github.com/vuduongtp/go-logadapter"

Basic Example

View full example here

Simple example
logadapter.Debug("debug message")
logadapter.Error("error message")
logadapter.Warn("warn message")
{"level":"debug","msg":"debug message","time":"2023-06-22 21:27:08.97942"}
{"level":"error","msg":"error message","source":"/go-logadpater:25","time":"2023-06-22 21:27:08.97951"}
{"level":"warning","msg":"warn message","source":"/go-logadpater:25","time":"2023-06-22 21:27:08.97952"}
Create new logger with config
logadapter.SetLogger(logadapter.NewWithConfig(&logadapter.Config{
LogLevel:        logadapter.DebugLevel,
LogFormat:       logadapter.JSONFormat,
TimestampFormat: time.RFC3339Nano,
IsUseLogFile:    true,
FileConfig: &logadapter.FileConfig{
  Filename:       "logs",
  MaxSize:        50,
  MaxBackups:     10,
  MaxAge:         30,
  IsCompress:     false,
  IsUseLocalTime: false,
},
}))
logadapter.Debug("test")
{"level":"debug","msg":"test","time":"2023-03-17T00:14:56.763181+07:00"}

Log with pertty JSON format

logadapter.SetFormatter(logadapter.PrettyJSONFormat)
logadapter.Debug("message")
{
  "level": "debug",
  "msg": "message",
  "time": "2023-03-17 00:03:07.14439"
}

Log with text format

logadapter.SetFormatter(logadapter.TextFormat)
logadapter.Debug("message")
time="2023-03-17 00:03:53.74972" level=debug msg=message

Add custome log field

ctx := context.Background()
ctx = logadapter.SetCustomLogField(ctx, "test", "test")
logadapter.InfoWithContext(ctx, "This is message 1")

logadapter.RemoveLogKey("test") // remove this key from log messages
logadapter.InfoWithContext(ctx, "This is message 2")
{"level":"info","test":"test","msg":"This is message 1","time":"2023-06-21 17:18:14.49578"}
{"level":"info","msg":"This is message 2","time":"2023-06-21 17:18:14.49586"}
Set gorm logger
isDebug := true
// set log adapter for gorm logging
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
  panic("failed to connect database")
}

if isDebug {
  db.Logger = logadapter.NewGormLogger().LogMode(logger.Info)
} else {
  db.Logger = logadapter.NewGormLogger().LogMode(logger.Silent)
}

// set one more log key
ctx := context.Background()
ctx = logadapter.SetCustomLogField(ctx, "database_name", "test")

type User interface{}
user := new(User)
db.WithContext(ctx).First(user)
{"level":"debug","database_name":"test","msg":"","time":"2023-06-21 16:53:53.14278","row":1,"query":"SELECT * FROM users ORDER BY id LIMIT 1","latency":"63.995042ms","latency_ms":63,"type":"sql"}
Set echo logger
isDebug := true
e := echo.New()
// set log adapter for echo instance
e.Logger = logadapter.NewEchoLogger()
if isDebug {
  e.Logger.SetLevel(log.DEBUG)
} else {
  e.Logger.SetLevel(log.ERROR)
}

// use log adapter middleware for echo web framework
e.Use(logadapter.NewEchoLoggerMiddleware())

e.GET("/", func(c echo.Context) error {
  logadapter.InfoWithContext(c.Request().Context(), "Message: ", "Hello, World!")
  return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.10.2
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                  O\
⇨ http server started on [::]:1323

-> go to http://localhost:1323/

{"correlation_id":"181e60c9d7b144a7a3960852b17efa45","level":"info","msg":"Message: Hello, World!","request_id":"ef4a720b-8af2-45b0-bf0b-4bdcb2424bd9","time":"2023-06-21 17:03:01.92469"}
{"byte_in":0,"byte_out":13,"correlation_id":"181e60c9d7b144a7a3960852b17efa45","host":"localhost:1323","ip":"127.0.0.1","latency":"427.875µs","latency_ms":0,"level":"info","method":"GET","msg":"","referer":"","request_id":"ef4a720b-8af2-45b0-bf0b-4bdcb2424bd9","status":200,"time":"2023-06-21 17:03:01.92513","type":"api","uri":"/","url":"/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0"}

If you really want to help us, simply Fork the project and apply for Pull Request. Thanks.

Documentation

Index

Constants

View Source
const (
	LogTypeAPI      = "api"
	LogTypeRequest  = "request"
	LogTypeResponse = "response"
	LogTypeError    = "error"
	LogTypeDebug    = "debug"
	LogTypeInfo     = "info"
	LogTypeWarn     = "warn"
	LogTypeSQL      = "sql"
	LogTypeTrace    = "trace"
)

custom logtype

View Source
const (
	DefaultTimestampFormat = "2006-01-02 15:04:05.00000"
	DefaultPrefix          = "LogAdapter_"
	DefaultSourceField     = "stack_trace"
)

custom constants

Variables

Export default LogKeyMap

Functions

func Debug added in v1.0.9

func Debug(args ...interface{})

Debug log with debug level

func DebugWithContext added in v1.0.11

func DebugWithContext(ctx context.Context, args ...interface{})

DebugWithContext log with debug level

func Error added in v1.0.9

func Error(args ...interface{})

Error log with error level

func ErrorWithContext added in v1.0.11

func ErrorWithContext(ctx context.Context, args ...interface{})

ErrorWithContext log with error level

func Fatal added in v1.0.9

func Fatal(args ...interface{})

Fatal log with fatal level

func FatalWithContext added in v1.0.11

func FatalWithContext(ctx context.Context, args ...interface{})

FatalWithContext log with fatal level

func GetLogFieldFromContext added in v1.0.11

func GetLogFieldFromContext(ctx context.Context) map[string]interface{}

GetLogFieldFromContext gets log field from context for log field

func GetTimestampFormat added in v1.0.9

func GetTimestampFormat() string

GetTimestampFormat get timestamp format

func Info added in v1.0.9

func Info(args ...interface{})

Info log with info level

func InfoWithContext added in v1.0.11

func InfoWithContext(ctx context.Context, args ...interface{})

InfoWithContext log with info level

func LogWithContext added in v1.0.11

func LogWithContext(ctx context.Context, content ...interface{})

LogWithContext log content with context content[0] : message -> interface{}, content[1] : log type -> string, content[2] : log field -> map[string]interface{}

func LogWithEchoContext

func LogWithEchoContext(c echo.Context, content ...interface{})

LogWithEchoContext log content with echo context content[0] : message -> interface{}, content[1] : log type -> string, content[2] : log field -> map[string]interface{}

func NewEchoLoggerMiddleware

func NewEchoLoggerMiddleware() echo.MiddlewareFunc

NewEchoLoggerMiddleware returns a middleware that logs HTTP requests.

func Panic added in v1.0.9

func Panic(args ...interface{})

Panic log with panic level

func PanicWithContext added in v1.0.11

func PanicWithContext(ctx context.Context, args ...interface{})

PanicWithContext log with panic level

func RemoveLogKey added in v1.0.11

func RemoveLogKey(key string)

RemoveLogKey export remove a log key will not log this key

func SetContext added in v1.0.12

func SetContext(ctx context.Context) *log.Entry

SetContext set log with context

func SetCustomLogField added in v1.0.11

func SetCustomLogField(ctx context.Context, logKey string, value interface{}) context.Context

SetCustomLogField set custom log field for always log this field, return new context

func SetDefaultFields added in v1.0.12

func SetDefaultFields(fields map[string]interface{})

SetDefaultFields set default fields for all log

func SetFormatter added in v1.0.9

func SetFormatter(logFormat LogFormat)

SetFormatter set logger formatter

func SetIgnoredPaths added in v1.1.0

func SetIgnoredPaths(paths []string)

SetIgnoredPaths for ignored path in stack trace field. By default logadapter print stacktrace with log has lever higher than WARN, always print stack trace with gorm_adapter Not to print file path has "runtime/" in stack trace. We use logadapter.UpdateIgnoredPaths([]string{"runtime/"})

func SetLevel added in v1.0.9

func SetLevel(level Level)

SetLevel set log level

func SetLogConsole added in v1.0.9

func SetLogConsole()

SetLogConsole set log console

func SetLogFile added in v1.0.9

func SetLogFile()

SetLogFile set log file, log file will be storaged in logs folder

func SetLogger added in v1.0.9

func SetLogger(logger *Logger)

SetLogger set logger instance

func SetTimestampFormat added in v1.0.9

func SetTimestampFormat(timestampFormat string)

SetTimestampFormat set timestamp format

func Trace added in v1.0.9

func Trace(args ...interface{})

Trace log with trace level

func TraceWithContext added in v1.0.11

func TraceWithContext(ctx context.Context, args ...interface{})

TraceWithContext log with trace level

func Warn added in v1.0.9

func Warn(args ...interface{})

Warn log with warn level

func WarnWithContext added in v1.0.11

func WarnWithContext(ctx context.Context, args ...interface{})

WarnWithContext log with warn level

Types

type Config

type Config struct {
	IsUseLogFile    bool        // set true if write to file
	FileConfig      *FileConfig // ignore if IsUseLogFile = false, set null if use default log file config
	LogLevel        Level
	LogFormat       LogFormat
	TimestampFormat string // if empty, use default timestamp format
}

Config config instance log

type EchoLogger added in v1.0.9

type EchoLogger struct {
	*Logger
}

EchoLogger extend logrus.Logger

func NewEchoLogger added in v1.0.9

func NewEchoLogger() *EchoLogger

NewEchoLogger return singleton logger

func (*EchoLogger) Debug added in v1.0.9

func (l *EchoLogger) Debug(i ...interface{})

Debug output message of debug level

func (*EchoLogger) Debugf added in v1.0.9

func (l *EchoLogger) Debugf(format string, args ...interface{})

Debugf output format message of debug level

func (*EchoLogger) Debugj added in v1.0.9

func (l *EchoLogger) Debugj(j log.JSON)

Debugj output message of debug level

func (*EchoLogger) Error added in v1.0.9

func (l *EchoLogger) Error(i ...interface{})

Error output message of error level

func (*EchoLogger) Errorf added in v1.0.9

func (l *EchoLogger) Errorf(format string, args ...interface{})

Errorf output format message of error level

func (*EchoLogger) Errorj added in v1.0.9

func (l *EchoLogger) Errorj(j log.JSON)

Errorj output json of error level

func (*EchoLogger) Fatal added in v1.0.9

func (l *EchoLogger) Fatal(i ...interface{})

Fatal output message of fatal level

func (*EchoLogger) Fatalf added in v1.0.9

func (l *EchoLogger) Fatalf(format string, args ...interface{})

Fatalf output format message of fatal level

func (*EchoLogger) Fatalj added in v1.0.9

func (l *EchoLogger) Fatalj(j log.JSON)

Fatalj output json of fatal level

func (*EchoLogger) Formatter added in v1.0.9

func (l *EchoLogger) Formatter() logrus.Formatter

Formatter return logger formatter

func (*EchoLogger) Info added in v1.0.9

func (l *EchoLogger) Info(i ...interface{})

Info output message of info level

func (*EchoLogger) Infof added in v1.0.9

func (l *EchoLogger) Infof(format string, args ...interface{})

Infof output format message of info level

func (*EchoLogger) Infoj added in v1.0.9

func (l *EchoLogger) Infoj(j log.JSON)

Infoj output json of info level

func (*EchoLogger) Level added in v1.0.9

func (l *EchoLogger) Level() log.Lvl

Level return logger level

func (*EchoLogger) Output added in v1.0.9

func (l *EchoLogger) Output() io.Writer

Output return logger io.Writer

func (*EchoLogger) Panic added in v1.0.9

func (l *EchoLogger) Panic(i ...interface{})

Panic output message of panic level

func (*EchoLogger) Panicf added in v1.0.9

func (l *EchoLogger) Panicf(format string, args ...interface{})

Panicf output format message of panic level

func (*EchoLogger) Panicj added in v1.0.9

func (l *EchoLogger) Panicj(j log.JSON)

Panicj output json of panic level

func (*EchoLogger) Prefix added in v1.0.9

func (l *EchoLogger) Prefix() string

Prefix return logger prefix This function do nothing

func (*EchoLogger) Print added in v1.0.9

func (l *EchoLogger) Print(i ...interface{})

Print output message of print level

func (*EchoLogger) Printf added in v1.0.9

func (l *EchoLogger) Printf(format string, args ...interface{})

Printf output format message of print level

func (*EchoLogger) Printj added in v1.0.9

func (l *EchoLogger) Printj(j log.JSON)

Printj output json of print level

func (*EchoLogger) SetFormatter added in v1.0.9

func (l *EchoLogger) SetFormatter(formatter logrus.Formatter)

SetFormatter logger formatter Only support logrus formatter

func (*EchoLogger) SetHeader added in v1.0.9

func (l *EchoLogger) SetHeader(h string)

SetHeader logger header Managed by Logrus itself This function do nothing

func (*EchoLogger) SetLevel added in v1.0.9

func (l *EchoLogger) SetLevel(v log.Lvl)

SetLevel logger level

func (*EchoLogger) SetOutput added in v1.0.9

func (l *EchoLogger) SetOutput(w io.Writer)

SetOutput logger io.Writer

func (*EchoLogger) SetPrefix added in v1.0.9

func (l *EchoLogger) SetPrefix(p string)

SetPrefix logger prefix This function do nothing

func (*EchoLogger) Warn added in v1.0.9

func (l *EchoLogger) Warn(i ...interface{})

Warn output message of warn level

func (*EchoLogger) Warnf added in v1.0.9

func (l *EchoLogger) Warnf(format string, args ...interface{})

Warnf output format message of warn level

func (*EchoLogger) Warnj added in v1.0.9

func (l *EchoLogger) Warnj(j log.JSON)

Warnj output json of warn level

type FileConfig

type FileConfig struct {
	Filename       string
	MaxSize        int // megabytes
	MaxBackups     int // number of log files
	MaxAge         int // days
	IsCompress     bool
	IsUseLocalTime bool
}

FileConfig config for write log to file

type GormLogger added in v1.0.9

type GormLogger struct {
	*Logger
	SlowThreshold         time.Duration
	SourceField           string
	SkipErrRecordNotFound bool
	Debug                 bool
}

GormLogger model

func NewGormLogger added in v1.0.9

func NewGormLogger() *GormLogger

NewGormLogger new gorm logger

func (*GormLogger) Error added in v1.0.9

func (l *GormLogger) Error(ctx context.Context, s string, args ...interface{})

Error log error

func (*GormLogger) Info added in v1.0.9

func (l *GormLogger) Info(ctx context.Context, s string, args ...interface{})

Info log infor

func (*GormLogger) LogMode added in v1.0.9

LogMode get log mode, should set to Silent level in production

func (*GormLogger) Trace added in v1.0.9

func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error)

Trace log sql trace

func (*GormLogger) Warn added in v1.0.9

func (l *GormLogger) Warn(ctx context.Context, s string, args ...interface{})

Warn log warn

type HeaderKey added in v1.0.11

type HeaderKey string

HeaderKey is key from http Header

const (
	CorrelationIDHeaderKey HeaderKey = "X-User-Correlation-Id"
	RequestIDHeaderKey     HeaderKey = "X-Request-ID"
	UserInfoHeaderKey      HeaderKey = "X-Userinfo"
)

Export HeaderKey constanst

type Level

type Level uint32

Level log level

const (
	// PanicLevel level, highest level of severity. Logs and then calls panic with the
	// message passed to Debug, Info, ...
	PanicLevel Level = iota
	// FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the
	// logging level is set to Panic.
	FatalLevel
	// ErrorLevel level. Logs. Used for errors that should definitely be noted.
	// Commonly used for hooks to send errors to an error tracking service.
	ErrorLevel
	// WarnLevel level. Non-critical entries that deserve eyes.
	WarnLevel
	// InfoLevel level. General operational entries about what's going on inside the
	// application.
	InfoLevel
	// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
	DebugLevel
	// TraceLevel level. Designates finer-grained informational events than the Debug.
	TraceLevel
)

type LogFormat

type LogFormat uint32

LogFormat log format

const (
	JSONFormat LogFormat = iota
	PrettyJSONFormat
	TextFormat
)

custom log format

func GetFormatter added in v1.0.9

func GetFormatter() LogFormat

GetFormatter get logger formatter

type LogKey added in v1.0.11

type LogKey string

LogKey is key for log messages

const (
	CorrelationIDLogKey LogKey = "correlation_id"
	RequestIDLogKey     LogKey = "request_id"
	UserInfoLogKey      LogKey = "user_info"
)

Export LogKey constanst

type Logger added in v1.0.1

type Logger struct {
	*log.Logger
	// contains filtered or unexported fields
}

Logger instance

func GetLogger added in v1.0.9

func GetLogger() *Logger

GetLogger set logger instance

func New added in v1.0.9

func New() *Logger

New returns a logger instance with default configuration

func NewWithConfig added in v1.0.9

func NewWithConfig(config *Config) *Logger

NewWithConfig returns a logger instance with custom configuration

func (*Logger) GetLogFieldFromContext added in v1.0.11

func (l *Logger) GetLogFieldFromContext(ctx context.Context) map[string]interface{}

GetLogFieldFromContext gets log field from context for log field

func (*Logger) RemoveLogKey added in v1.0.11

func (l *Logger) RemoveLogKey(key string)

RemoveLogKey remove a log key will not log this key

func (*Logger) SetContext added in v1.0.11

func (l *Logger) SetContext(ctx context.Context) *log.Entry

SetContext set log with context

func (*Logger) SetCustomLogField added in v1.0.11

func (l *Logger) SetCustomLogField(ctx context.Context, logKey string, value interface{}) context.Context

SetCustomLogField set custom log field for always log this field, return new context

func (*Logger) SetDefaultFields added in v1.0.12

func (l *Logger) SetDefaultFields(fields map[string]interface{})

SetDefaultFields set default fields for all log

func (*Logger) SetFormatter added in v1.0.1

func (l *Logger) SetFormatter(logFormat LogFormat)

SetFormatter set logger formatter

func (*Logger) SetIgnoredPaths added in v1.1.0

func (l *Logger) SetIgnoredPaths(paths []string)

SetIgnoredPaths for ignored path in stack trace field. By default logadapter print stacktrace with log has lever higher than WARN, always print stack trace with gorm_adapter Not to print file path has "runtime/" in stack trace. We use logadapter.UpdateIgnoredPaths([]string{"runtime/"})

func (*Logger) SetLevel added in v1.0.1

func (l *Logger) SetLevel(level Level)

SetLevel set log level

func (*Logger) SetLogConsole added in v1.0.1

func (l *Logger) SetLogConsole()

SetLogConsole set log console

func (*Logger) SetLogFile added in v1.0.1

func (l *Logger) SetLogFile()

SetLogFile set log file, log file will be storaged in logs folder

func (*Logger) SetLogFileWithConfig added in v1.0.10

func (l *Logger) SetLogFileWithConfig(fileConfig *FileConfig)

SetLogFileWithConfig set log file with file config

func (*Logger) SetTimestampFormat added in v1.0.2

func (l *Logger) SetTimestampFormat(timestampFormat string)

SetTimestampFormat set timestamp format

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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