【go工程组件】结构化日志记录logrus
最近更新:2024-12-12
|
字数总计:619
|
阅读估时:3分钟
|
阅读量:次
- 结构化日志记录logrus
- Writer封装
- STD
- File
- File-Rotate
- Hook
- Log封装
- 使用封装好的Logs库
结构化日志记录logrus
- 应用场景
- 应用程序日志记录
- 优势
- 支持文本+json数据格式
- 支持结构化记录
- 支持hook
- 安装依赖
1 2
| go get github.com/sirupusen/logrus go get github.com/lestrrat-go/file-rotatelogs # 文件切分
|
Writer封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package logs
import "io"
type LogWriter interface { Flush() io.Writer }
var writerAdapter = make(map[string]func() LogWriter, 0)
func RegisterInitWriterFunc(adapterName string, writerFunc func() LogWriter) { writerAdapter[adapterName] = writerFunc }
|
STD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package logs
import "os"
type stdWriter struct { *os.File }
func (s *stdWriter) Flush() { s.Sync() }
func newStdWriter() LogWriter { return &stdWriter{ os.Stderr, } }
func init() { RegisterInitWriterFunc("std", newStdWriter) }
|
File
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package logs
import "os"
const LOGPATH = "runtime/logs/mylogs.log"
type fileWriter struct { *os.File }
func (s *fileWriter) Flush() { s.Sync() }
func newFileWriter() LogWriter { file, err := os.OpenFile(LOGPATH, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { file = os.Stderr } return &fileWriter{ file, } }
func init() { RegisterInitWriterFunc("file", newFileWriter) }
|
File-Rotate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package logs
import ( "log" "time"
rotatelogs "github.com/lestrrat-go/file-rotatelogs" )
type fileRotateWriter struct { *rotatelogs.RotateLogs }
func (fr *fileRotateWriter) Flush() { fr.Close() }
func newFileRotateWriter() LogWriter { writer, err := getRotateLogs() if err != nil { log.Fatal(err) } return &fileRotateWriter{ writer, } }
func getRotateLogs() (*rotatelogs.RotateLogs, error) { path := LOGPATH logf, err := rotatelogs.New( path+".%Y%m%d%H%M", rotatelogs.WithLinkName(path), rotatelogs.WithMaxAge(time.Second*1800), rotatelogs.WithRotationTime(time.Hour), ) return logf, err }
func init() { RegisterInitWriterFunc("file-rotate", newFileRotateWriter) }
|
Hook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package logs
import ( "log"
"github.com/sirupsen/logrus" )
type MyHook struct{}
func (hook *MyHook) Levels() []logrus.Level { return []logrus.Level{logrus.ErrorLevel} }
func (hook *MyHook) Fire(entry *logrus.Entry) error { log.Printf("%+v", entry) return nil }
|
Log封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package logs
import ( "github.com/sirupsen/logrus" )
type Log struct { *logrus.Entry LogWriter }
func (l *Log) Flush() { l.LogWriter.Flush() }
type LogConf struct { Level logrus.Level AdapterName string Hook logrus.Hook }
func InitLog(conf LogConf) *Log { adapterName := "std" if conf.AdapterName != "" { adapterName = conf.AdapterName } writerFunc, ok := writerAdapter[adapterName] if !ok { adapterName = "std" writerFunc, _ = writerAdapter[adapterName] } log := &Log{ logrus.NewEntry(logrus.New()), writerFunc(), } log.Logger.SetFormatter(&logrus.JSONFormatter{}) if conf.Hook != nil { log.Logger.AddHook(conf.Hook) } log.Logger.SetOutput(log.LogWriter) if conf.Level != 0 { log.Logger.SetLevel(conf.Level) } log.Logger.SetReportCaller(true) return log }
|
使用封装好的Logs库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package main
import ( "logrus/logs"
"github.com/sirupsen/logrus" )
func main() { conf := logs.LogConf{ Level: logrus.InfoLevel, AdapterName: "file-rotate", Hook: &logs.MyHook{}, } log := logs.InitLog(conf)
log.WithFields(logrus.Fields{ "animal": "walrus", "size": 10, }).Info("A group of walrus emerges from the ocean")
log.WithFields(logrus.Fields{ "omg": true, "number": 122, }).Error("The group's number increased tremendously!")
log.WithFields(logrus.Fields{ "omg": true, "number": 100, }).Warn("the ice breaks!")
contextLogger := log.WithFields(logrus.Fields{ "common": "this is a common field", "other": "i also should be logged always", })
contextLogger.Info("i'll be logged with common and other field") contextLogger.Info("me too") defer log.Flush() }
|
2024-12-11
该篇文章被 Cleofwine
归为分类:
Go云原生