“github.com/sirupsen/logrus”

示例:

  1. package main
  2. import (
  3. "os"
  4. log "github.com/sirupsen/logrus"
  5. )
  6. func init() {
  7. // 设置日志格式为json格式
  8. log.SetFormatter(&log.JSONFormatter{})
  9. // 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
  10. // 日志消息输出可以是任意的io.writer类型
  11. log.SetOutput(os.Stdout)
  12. // 设置日志级别为warn以上
  13. log.SetLevel(log.WarnLevel)
  14. }
  15. func main() {
  16. log.WithFields(log.Fields{
  17. "animal": "walrus",
  18. "size": 10,
  19. }).Info("A group of walrus emerges from the ocean")
  20. log.WithFields(log.Fields{
  21. "omg": true,
  22. "number": 122,
  23. }).Warn("The group's number increased tremendously!")
  24. log.WithFields(log.Fields{
  25. "omg": true,
  26. "number": 100,
  27. }).Fatal("The ice breaks!")
  28. }
  1. package main
  2. import (
  3. "github.com/sirupsen/logrus"
  4. "os"
  5. )
  6. // logrus提供了New()函数来创建一个logrus的实例。
  7. // 项目中,可以创建任意数量的logrus实例。
  8. var log = logrus.New()
  9. func main() {
  10. // 为当前logrus实例设置消息的输出,同样地,
  11. // 可以设置logrus实例的输出到任意io.writer
  12. log.Out = os.Stdout
  13. // 为当前logrus实例设置消息输出格式为json格式。
  14. // 同样地,也可以单独为某个logrus实例设置日志级别和hook,这里不详细叙述。
  15. log.Formatter = &logrus.JSONFormatter{}
  16. log.WithFields(logrus.Fields{
  17. "animal": "walrus",
  18. "size": 10,
  19. }).Info("A group of walrus emerges from the ocean")
  20. }

logrus的hook接口定义如下,其原理是每此写入日志时拦截,修改logrus.Entry。

  1. // logrus在记录Levels()返回的日志级别的消息时会触发HOOK,
  2. // 按照Fire方法定义的内容修改logrus.Entry。
  3. type Hook interface {
  4. Levels() []Level
  5. Fire(*Entry) error
  6. }
  1. 一个简单自定义hook如下,DefaultFieldHook定义会在所有级别的日志消息中加入默认字段appName="myAppName"
  2. type DefaultFieldHook struct {
  3. }
  4. func (hook *DefaultFieldHook) Fire(entry *log.Entry) error {
  5. entry.Data["appName"] = "MyAppName"
  6. return nil
  7. }
  8. // 设置感兴趣的字段
  9. func (hook *DefaultFieldHook) Levels() []log.Level {
  10. return log.AllLevels
  11. }

hook的使用也很简单,在初始化前调用log.AddHook(hook)添加相应的hook即可。

logrus官方仅仅内置了syslog的hook。
此外,但Github也有很多第三方的hook可供使用,文末将提供一些第三方HOOK的连接。

Windows控制台彩色输出

“github.com/shiena/ansicolor”

  1. client.SetFormatter(&logrus.TextFormatter{
  2. FullTimestamp: true,
  3. TimestampFormat: "2006-01-02 15:04:05",
  4. ForceColors: true,
  5. })
  6. client.SetOutput(ansicolor.NewAnsiColorWriter(os.Stdout))

日志分割

  1. func NewLoggerClient(config model.Log) Logger {
  2. client := logrus.New()
  3. // lofClient as JSON instead of the default ASCII formatter.
  4. client.SetFormatter(&logrus.TextFormatter{
  5. FullTimestamp: true,
  6. TimestampFormat: "2006-01-02 15:04:05",
  7. ForceColors: true,
  8. })
  9. writer, _ := rotatelogs.New(
  10. config.ReservePath +"%Y%m%d%H%M.txt",
  11. rotatelogs.WithLinkName(config.ReservePath + "/当前日志"),
  12. rotatelogs.WithMaxAge(time.Hour),
  13. rotatelogs.WithRotationTime(time.Duration(24 * config.RetentionTime)*time.Hour),
  14. )
  15. log.SetOutput(io.MultiWriter(writer, os.Stdout))
  16. // Output to stdout instead of the default stderr
  17. // Can be any io.Writer, see below for File example
  18. client.SetOutput(ansicolor.NewAnsiColorWriter(os.Stdout))
  19. // Only log the warning severity or above.
  20. client.SetLevel(getLogLevel(config.Level))
  21. Client = &lofClient{client: client}
  22. return Client
  23. }