golang日志配置

413 阅读3分钟

日志使用

golang中使用比较多的日志包是logrus,一般为了输出日志文件及日志文件切割可以使用natefinch/lumberjack库。

logrus

github地址: github.com/sirupsen/lo…

安装库

go get github.com/sirupsen/logrus

简单使用

  • 配置一个logrus实例,配置实例日志格式,将日志输出到logrus.log文件中。
package main

import (
   "os"

   "github.com/sirupsen/logrus"
)

func Example_basic() {
   var log = logrus.New()
   log.Formatter = new(logrus.JSONFormatter)
   log.Formatter = new(logrus.TextFormatter)                     //default
   log.Formatter.(*logrus.TextFormatter).DisableColors = true    // remove colors
   log.Formatter.(*logrus.TextFormatter).DisableTimestamp = true // remove timestamp from test output
   log.Level = logrus.TraceLevel
   log.Out = os.Stdout

   file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666)
   if err == nil {
      log.Out = file
   } else {
      log.Info("Failed to log to file, using default stderr")
   }

   for i := 0; i < 10; i++ {
      log.Info("test ", i)
   }
  • 配置fields打印不同级别的日志

logrus支持更多的日志级别:

  1. Panic:记录日志,然后panic
  2. Fatal:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;
  3. Error:错误日志,需要查看原因;
  4. Warn:警告信息,提醒程序员注意;
  5. Info:关键操作,核心流程的日志;
  6. Debug:一般程序中输出的调试信息;
  7. Trace:很细粒度的信息,一般用不到;
package main

import (
   "os"

   "github.com/sirupsen/logrus"
)

func Example_basic() {
   var log = logrus.New()
   log.Formatter = new(logrus.JSONFormatter)
   log.Formatter = new(logrus.TextFormatter)                     //default
   log.Formatter.(*logrus.TextFormatter).DisableColors = true    // remove colors
   log.Formatter.(*logrus.TextFormatter).DisableTimestamp = true // remove timestamp from test output
   log.Level = logrus.TraceLevel
   log.Out = os.Stdout

   for i := 0; i < 10; i++ {
      log.Info("test ", i)
   }
   defer func() {
      err := recover()
      if err != nil {
         entry := err.(*logrus.Entry)
         log.WithFields(logrus.Fields{
            "omg":         true,
            "err_animal":  entry.Data["animal"],
            "err_size":    entry.Data["size"],
            "err_level":   entry.Level,
            "err_message": entry.Message,
            "number":      100,
         }).Error("The ice breaks!") // or use Fatal() to force the process to exit with a nonzero code
      }
   }()

   log.WithFields(logrus.Fields{
      "animal": "walrus",
      "number": 0,
   }).Trace("Went to the beach")

   log.WithFields(logrus.Fields{
      "animal": "walrus",
      "number": 8,
   }).Debug("Started observing beach")

   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,
   }).Warn("The group's number increased tremendously!")

   log.WithFields(logrus.Fields{
      "temperature": -4,
   }).Debug("Temperature changes")

   log.WithFields(logrus.Fields{
      "animal": "orca",
      "size":   9009,
   }).Panic("It's over 9000!")

}

lumberjack

Golang 语言标准库的 log 包不支持日志切割,然而如果我们业务每天产生海量日志,日志文件就会越来越大,甚至会触发磁盘空间不足的报警,此时如果我们移动或者删除日志文件,需要先将业务停止写日志,很不方便。Golang 语言三方库 lumberjack 的作用就是进行日志切割,下面我们来介绍一下 lumberjack。

安装库

go get -u github.com/natefinch/lumberjack

导入库

import "gopkg.in/natefinch/lumberjack.v2"

使用

将 lumberjack 与标准库的 log 包一起使用,只需在应用程序启动时将它传递到 SetOutput 函数。

log.SetOutput(&Logger{ 
    Filename: "/var/log/myapp/foo.log", 
    MaxSize: 500, // megabytes 
    MaxBackups: 3,  
    MaxAge: 28, // days  
    Compress: true, // disabled by default
 })

lumberjack 的 Logger 结构体,是一个写入指定文件的 io.WriteCloser。Logger 在第一次写入时打开或创建日志文件。如果文件存在且小于 MaxSize 的值,lumberjack 将打开并追加到该文件。如果文件存在且其 size 的值为大于等于 MaxSize,文件通过将当前时间作为文件名的一部分进行重命名文件,然后使用原始文件名创建新的日志文件。

每当写入会导致当前日志文件超过 MaxSize 的值时,当前文件将关闭和重命名,并且使用原始名称创建的新日志文件。因此,Logger 的文件名始终是当前日志文件。

备份使用给定给 Logger 的日志文件名,其中名称是没有扩展名的文件名,时间戳是日志与时间一起旋转的时间。时间格式是 2006-01-02T15-04-05.000,扩展是原始扩展。例如,如果您的 Logger.Filename 是 /var/log/foo/server.log,那么 2016 年 11 月 11 日下午 6:30 创建的备份将使用 filenam 是 /var/log/foo/server-2016-11-04T18-30-00.000.log

参考: cloud.tencent.com/developer/a…

github.com/natefinch/l…