logrus特性
完全兼容golang标准库日志模块:logrus拥有六种日志级别:debug、info、warn、error、fatal和panic,这是golang标准库日志模块的API的超集。如果您的项目使用标准库日志模块,完全可以以最低的代价迁移到logrus上。
可扩展的Hook机制:允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
可选的日志输出格式:logrus内置了两种日志格式,
JSONFormatter
和TextFormatter
,如果这两个格式不满足需求,可以自己动手实现接口Formatter
,来定义自己的日志格式。Field机制:logrus鼓励通过Field机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志。
logrus是一个可插拔的、结构化的日志框架。
logrus使用
简单示例
1 | package main |
输出结果:
1 | time="2018-08-11T15:42:22+08:00" level=info msg="A walrus appears" animal=walrus |
简单配置
1 | package main |
Logger
logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger
对象来记录项目所有的日志。
1 | package main |
Fields
logrus不推荐使用冗长的消息来记录运行信息,它推荐使用Fields
来进行精细化的、结构化的信息记录。
1 | log.WithFields(log.Fields{ |
前面的WithFields
API可以规范使用者按照其提倡的方式记录日志。但是WithFields
依然是可选的,因为某些场景下,使用者确实只需要记录仪一条简单的消息。
通常,在一个应用中、或者应用的一部分中,都有一些固定的Field
。比如在处理用户http请求时,上下文中,所有的日志都会有request_id
和user_ip
。为了避免每次记录日志都要使用log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})
,我们可以创建一个logrus.Entry
实例,为这个实例设置默认Fields
,在上下文中使用这个logrus.Entry
实例记录日志即可。
1 | requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) |
日志本地文件分割
logrus本身不带日志本地文件分割功能,但是我们可以通过file-rotatelogs
进行日志本地文件分割。 每次当我们写入日志的时候,logrus都会调用file-rotatelogs
来判断日志是否要进行切分。
1 | import ( |
结合IRIS使用
先初始化一个Logger出来
config/config.go
定义一个log配置的结构体
1 | type LogConfig struct { |
config/logger.go` 根据配置的日志级别,日志路径,日志保留天数初始化一个Logger
1 | package config |
再撸一个中间件打印请求记录middleware/logger_middleware.go
1 | package middleware |
加进路由route/route.go
1 | package route |
最后感觉还是不咋好用,用Json格式不太好看,用Text格式又没有时间,再寻找一下别的Log库看看!