当前位置:网站首页>Go日志库——logrus
Go日志库——logrus
2022-07-29 23:49:00 【fun binary】
简介
logrus是目前Github上star数量最多的日志包,功能强大、性能高效、高度灵活,还提供了自定义插件的功能。很多优秀的开源项目,例如:docker、prometheus等都使用了logrus。logrus除了具有日志的基本功能外,还具有如下特性:
● 支持常用的日志级别,logrus支持如下日志级别:Debug、Info、Warn、Error、Fatal和Panic。
● 可扩展,logrus的hook机制允许使用者通过hook的方式将日志分发到任意地方,例如:本地文件、标准输出、elasticsearch、logstash、kafka等。
● 支持自定义日志格式,logrus内置了2种格式:JSONFormatter和TextFormatter。除此之外,logrus允许使用者通过实现Formatter接口,来自定义日志格式。
● 结构化日志记录,logrus的Field机制可以允许使用者自定义日志字段,而不是通过冗长的消息来记录日志。
● 预设日志字段,logrus的Default Fields机制可以给一部分或者全部日志统一添加共同的日志字段,例如给某次HTTP请求的所有日志添加X-Request-ID字段。
● Fatal handlers:logrus允许注册一个或多个handler,当发生fatal级别的日志时调用。当我们的程序需要优雅关闭时,该特性会非常有用。
快速开始
logrus可以通过简单的配置,来定义输出、格式或者日志级别等,示例如下:
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func main() {
// logrus设置
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetOutput(os.Stdout)
logrus.SetLevel(logrus.WarnLevel)
// logrus使用
logrus.Debug("Useful debugging information.")
logrus.Info("Something noteworthy happened!")
logrus.Warn("You should probably take a look at this.")
logrus.Error("Something failed but I'm not quitting.")
logrus.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
logrus.WithFields(logrus.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
}
可以通过logrus.SetFormatter设置输出的日志格式,logrus自带有JSONFormatter和TextFormatter。通过logrus.SetLevel来设置日志级别,通过logrus.SetOutput设置日志输出等。
假设上述代码保存在example1.go文件中,运行代码:
$ go run example1.go
{“level”:“warning”,“msg”:“You should probably take a look at this.”,“time”:“2020-12-03T22:35:35+08:00”}
{“level”:“error”,“msg”:“Something failed but I’m not quitting.”,“time”:“2020-12-03T22:35:35+08:00”}
{“level”:“warning”,“msg”:“The group’s number increased tremendously!”,“number”:122,“omg”:true,“time”:“2020-12-03T22:35:35+08:00”}
API

功能介绍
Default Fields
通常,在一个应用中、或者应用的一部分中,始终附带一些固定的记录字段会很有帮助。比如在处理用户HTTP请求时,上下文中所有的日志都会有request_id。为了避免每次记录日志都要使用:
logrus.WithFields(logrus.Fields{“request_id””, request_id})
我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,把logrus.Entry实例设置到记录器Logger,再记录日志时每次都会附带上这些默认的字段。
logger := log.WithFields(log.Fields{“request_id”: request_id})
logger.Info(“something happened on that request”) // 也会记录request_id
logger.Warn(“something not great happened”)
Hook接口
logrus具有hook能力,允许我们自定义一些日志处理逻辑,实现一个hook只需要实现如下接口:
// logrus在记录Levels()返回的日志级别的消息时会触发HOOK,
// 按照Fire方法定义的内容修改logrus.Entry.
type Hook interface {
Levels() []Level
Fire(*Entry) error
}
一个简单自定义hook如下,DefaultFieldHook定义会在所有级别的日志消息中加入默认字段myHook=“MyHookTest”:
type DefaultFieldHook struct {
}
func (hook *DefaultFieldHook) Fire(entry *log.Entry) error {
entry.Data[“myHook”] = " MyHookTest "
return nil
}
func (hook *DefaultFieldHook) Levels() []log.Level {
return log.AllLevels
}
实现了hook之后,只需要调用log.AddHook(hook)即可将自定义的hook注册到logrus中。通过hook可以实现很多强大的日志处理功能,比较常见的用法是,当有指定级别的日志产生时,邮件通知或者告警给相关负责人。
格式化
logrus内置的日志格式化程序是:
logrus.TextFormatter. 如果 stdout 是 tty,则以颜色记录事件,否则不带颜色。
注意:要在没有 TTY 时强制彩色输出,请将ForceColors 字段设置为true。即使有 TTY,也要强制不进行彩色输出,请将 DisableColors字段设置为true.
启用颜色时,默认情况下级别被截断为 4 个字符。要禁用截断,请将DisableLevelTruncation字段设置为true。
输出到 TTY 时,在视觉上向下扫描所有级别宽度相同的列通常很有帮助。通过向关卡文本添加填充来设置该PadLevelText字段以true启用此行为。
所有选项都列在生成的文档中。
logrus.JSONFormatter. 将字段记录为 JSON。
所有选项都列在生成的文档中。
第三方日志格式化程序:
- FluentdFormatter. 可被 Kubernetes 和 Google Container Engine 解析的格式条目。
- GELF. 格式化条目,使其符合 Graylog 的GELF 1.1 规范。
- logstash. 将字段记录为Logstash事件。
- prefixed. 显示日志条目源以及替代布局。
- zalgo. 调用 Zalgo 的力量。
- nested-logrus-formatter. 将 logrus 字段转换为嵌套结构。
- powerful-logrus-formatter. 打印日志时获取文件名、日志行号和最新函数名;Sava 日志到文件。
- caption-json-formatter. logrus 的消息 json 格式化程序,添加了人类可读的标题。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习]
边栏推荐
- C陷阱与缺陷 第4章 链接 4.1 什么是链接器
- High Numbers|Calculation of Triple Integral 3|Uncle High Numbers|Handwritten Notes
- Adaptive feature fusion pyramid network for multi-classes agriculturalpest detection
- 【分层强化学习】survey
- Decision tree principle and code implementation
- 【无标题】清空吗
- devops学习(七) sonarqube 代码质检工具
- 437. The total path III low low
- First Normal Form, Second Normal Form, Third Normal Form
- [2023 School Recruitment Questions] Summary of knowledge points and hand-tear code in the written test and interview
猜你喜欢

关于MySQL索引的一些个人理解(部分参考MySQL45讲)

软件测试拿8k以上有多简单,掌握这些随随便便拿8k以上...

指令集数据产品如何设计和实现报表协同系统——基于指令集物联网操作系统的工业协同制造项目开发实践

In 2022, the latest Gansu construction staff (material staff) mock exam questions and answers

学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难

Install PyCharm on Raspberry Pi

【分层强化学习】HAC源码解读

EA&UML日拱一卒-多任务编程超入门-(9)线程同步

jenkins use and maintenance

opencv基本图像的滤波
随机推荐
Brute force recursion to dynamic programming 03 (knapsack problem)
Elephant Swap:借助ePLATO提供加密市场的套利空间
论文精读——YOLOv3: An Incremental Improvement
「大厂必备」系列之Redis主从、持久化、哨兵
jenkins搭建部署详细步骤
Allure环境部署与生成+Allure内容增强
C陷阱与缺陷 第4章 链接 4.4 形参、实参与返回值
能源企业数字化转型背景下的数据安全治理实践路径
彻底搞懂kubernetes调度框架与插件
微信小程序获取手机号getPhoneNumber接口报错41001
Codeforces Round #805 (Div. 3)总结
MySQL函数(经典收藏)
图像的IO操作
全国双非院校考研信息汇总整理 Part.3
y81. Chapter 4 Prometheus Factory Monitoring System and Actual Combat -- Monitoring Extension (12)
接口测试的概念、目的、流程、测试方法有哪些?
Mysql8.0新特性之详细版本
devops学习(九) Helm工具--持续部署
新标杆!美创科技助力广西桂林某三甲医院实现勒索病毒主动防御
437. The total path III low low