“github.com/sirupsen/logrus”
示例:
package main
import (
"os"
log "github.com/sirupsen/logrus"
)
func init() {
// 设置日志格式为json格式
log.SetFormatter(&log.JSONFormatter{})
// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
// 日志消息输出可以是任意的io.writer类型
log.SetOutput(os.Stdout)
// 设置日志级别为warn以上
log.SetLevel(log.WarnLevel)
}
func main() {
log.WithFields(log.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
log.WithFields(log.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
log.WithFields(log.Fields{
"omg": true,
"number": 100,
}).Fatal("The ice breaks!")
}
package main
import (
"github.com/sirupsen/logrus"
"os"
)
// logrus提供了New()函数来创建一个logrus的实例。
// 项目中,可以创建任意数量的logrus实例。
var log = logrus.New()
func main() {
// 为当前logrus实例设置消息的输出,同样地,
// 可以设置logrus实例的输出到任意io.writer
log.Out = os.Stdout
// 为当前logrus实例设置消息输出格式为json格式。
// 同样地,也可以单独为某个logrus实例设置日志级别和hook,这里不详细叙述。
log.Formatter = &logrus.JSONFormatter{}
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
}
logrus的hook接口定义如下,其原理是每此写入日志时拦截,修改logrus.Entry。
// logrus在记录Levels()返回的日志级别的消息时会触发HOOK,
// 按照Fire方法定义的内容修改logrus.Entry。
type Hook interface {
Levels() []Level
Fire(*Entry) error
}
一个简单自定义hook如下,DefaultFieldHook定义会在所有级别的日志消息中加入默认字段appName="myAppName"。
type DefaultFieldHook struct {
}
func (hook *DefaultFieldHook) Fire(entry *log.Entry) error {
entry.Data["appName"] = "MyAppName"
return nil
}
// 设置感兴趣的字段
func (hook *DefaultFieldHook) Levels() []log.Level {
return log.AllLevels
}
hook的使用也很简单,在初始化前调用log.AddHook(hook)添加相应的hook即可。
logrus官方仅仅内置了syslog的hook。
此外,但Github也有很多第三方的hook可供使用,文末将提供一些第三方HOOK的连接。
Windows控制台彩色输出
“github.com/shiena/ansicolor”
client.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
ForceColors: true,
})
client.SetOutput(ansicolor.NewAnsiColorWriter(os.Stdout))
日志分割
func NewLoggerClient(config model.Log) Logger {
client := logrus.New()
// lofClient as JSON instead of the default ASCII formatter.
client.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
ForceColors: true,
})
writer, _ := rotatelogs.New(
config.ReservePath +"%Y%m%d%H%M.txt",
rotatelogs.WithLinkName(config.ReservePath + "/当前日志"),
rotatelogs.WithMaxAge(time.Hour),
rotatelogs.WithRotationTime(time.Duration(24 * config.RetentionTime)*time.Hour),
)
log.SetOutput(io.MultiWriter(writer, os.Stdout))
// Output to stdout instead of the default stderr
// Can be any io.Writer, see below for File example
client.SetOutput(ansicolor.NewAnsiColorWriter(os.Stdout))
// Only log the warning severity or above.
client.SetLevel(getLogLevel(config.Level))
Client = &lofClient{client: client}
return Client
}