马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、Logrus简介
Logrus 是一个流行的 Go 语言日志库,以其功能强大、性能高效和高度机动性而闻名。有关更多介绍可检察 Logrus。
重要特点
- 丰富的日志级别:Logrus 支持多种日志级别,包罗 Debug、Info、Warn、Error、Fatal 和 Panic,以及更细粒度的 Trace 级别。这些级别可以帮助开发者根据日志的严峻程度举行筛选和处置惩罚。
- 多种输出格式:Logrus 支持文本(TextFormatter)和 JSON(JSONFormatter)两种内置的日志格式,并且允许用户通过实现 Formatter 接口来自定义日志格式。
- 结构化日志记载:Logrus 的 Field 机制允许用户为日志添加自定义字段,这些字段将作为日志消息的一部门被记载,使得日志信息更加结构化和易于查询。
- 可扩展的钩子机制:Logrus 提供了钩子(hook)机制,允许用户通过编写自定义的 hook 来扩展日志的功能,例如将日志发送到远程服务器、写入文件等。
- 预设日志字段:Logrus 的 Default Fields 机制可以给一部门或全部日志统一添加共同的日志字段,如请求ID、用户IP等。
二、Logrus基本用法
1、安装logrus包
- go get github.com/sirupsen/logrus
复制代码 2、引入logrus包
- import "github.com/sirupsen/logrus"
复制代码 3、设置日志级别
- logrus.SetLevel(log.DebugLevel)
复制代码 4、设置日志格式化器
- logrus.SetFormatter(&logrus.TextFormatter{
- FullTimestamp: true, // 完整时间
- TimestampFormat: "2006-01-02 15:04:05", // 时间格式
- ForceColors: true, //显示颜色
- })
复制代码 5、设置日志输出范例
- // 创建日志文件
- file, _ := os.OpenFile("logs/application.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
- // 设置日志输出到文件
- // logrus.SetOutput(file)
- // 日志输出到文件和控制台
- logrus.SetOutput(io.MultiWriter(file, os.Stdout))
- // 输出到控制台
- // logrus.SetOutput(os.Stdout)
复制代码 6、记载日志
- logrus.WithField("appName", "测试logrus").Debug("这是一条Debug日志")
- logrus.WithField("appName", "测试logrus").Info("这是一条Info日志")
- logrus.WithFields(logrus.Fields{
- "appName": "测试logrus",
- "appId": 101,
- }).Info("这是一条Info日志")
复制代码 结果示例:
三、Logrus进阶用法
1、显示行号
- // 显示行号
- logrus.SetReportCaller(true)
复制代码 结果演示:
2、hook机制
在 logrus 中,钩子(Hooks)是一种在日志条目(log entry)被处置惩罚之前或之后执行自定义逻辑的机制。你可以使用钩子来执行诸如将日志发送到外部服务(如 Sentry、Splunk 等)、修改日志消息、添加额外的日志上下文等任务。
使用方法:
实现logrus.Hook接口,其接口定义为:
- type Hook interface {
- Levels() []Level
- Fire(*Entry) error
- }
复制代码
完整代码:
- package main
- import (
- "os"
- "github.com/sirupsen/logrus"
- )
- // 自定义hook
- type simpleHook struct {
- }
- // 实现logrus.Hook接口
- func (h *simpleHook) Levels() []logrus.Level {
- // 只有日志级别为 ErrorLevel 的日志执行 Fire 中定义的操作
- return []logrus.Level{logrus.ErrorLevel}
- }
- func (h *simpleHook) Fire(entry *logrus.Entry) error {
- // 在日志条目被处理时执行的逻辑
- entry.Data["appName"] = "test"
- // 将错误级别的日志添加单独的错误文件中
- file, _ := os.OpenFile("logs/error.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
- defer file.Close()
- line, _ := entry.String()
- file.Write([]byte(line))
- return nil
- }
- func main() {
- // 注册hook
- logrus.AddHook(&simpleHook{})
- logrus.Info("测试钩子")
- // 只有 error 级别的日志才显示 appName = test
- logrus.Error("测试钩子---错误信息")
- }
复制代码 结果演示:
错误信息被单独写入logs/error.log文件中,如下:
3、按时间分割日志
Logrus自己不支持日志轮转切割功能,需要共同 file-rotatelogs 包来实现。
- go get github.com/lestrrat-go/file-rotatelogs
复制代码
- 新建 RotateLogs(实现了 io.Writer 的 Write 方法)
- // 创建一个 writer
- logWriter, err := rotatelogs.New(
- filepath.Join("logs", "syslog_%Y%m%d%H%M%S.log"), //日志路径
- rotatelogs.WithLinkName(filepath.Join("logs", "syslog.log")),
- rotatelogs.WithMaxAge(7*24*time.Hour), // 最大保留天数:7天
- rotatelogs.WithRotationTime(10*time.Second), // 日志分割时间:1分钟
- )
- if err != nil {
- panic(err)
- }
复制代码
- // 新建Hook,将 otatelogs作为 writer
- hook := lfshook.NewHook(logWriter,
- &logrus.TextFormatter{
- TimestampFormat: "2006-01-02 15:04:05",
- FullTimestamp: true,
- },
- )
复制代码
- // 注册 hook
- logger.AddHook(hook)
复制代码 完整代码:
- package main
- import (
- "io"
- "path/filepath"
- "time"
- rotatelogs "github.com/lestrrat-go/file-rotatelogs"
- "github.com/rifflock/lfshook"
- "github.com/sirupsen/logrus"
- )
- func main() {
- // 创建一个 writer
- logWriter, err := rotatelogs.New(
- filepath.Join("logs", "syslog_%Y%m%d%H%M%S.log"), //日志路径
- rotatelogs.WithLinkName(filepath.Join("logs", "syslog.log")),
- rotatelogs.WithMaxAge(7*24*time.Hour), // 最大保留天数:7天
- rotatelogs.WithRotationTime(10*time.Second), // 日志分割时间:10秒
- )
- if err != nil {
- panic(err)
- }
- // 新建Hook,将 otatelogs作为 writer
- hook := lfshook.NewHook(logWriter,
- &logrus.TextFormatter{
- TimestampFormat: "2006-01-02 15:04:05",
- FullTimestamp: true,
- },
- )
- // 创建一个 logger
- logger := logrus.New()
- logger.SetReportCaller(true)
- logger.SetOutput(io.Discard)
- // 注册 hook
- logger.AddHook(hook)
- // 记录日志
- for i := 0; i < 10; i++ {
- logger.Info("Hello world!!")
- time.Sleep(3 * time.Second)
- }
- }
复制代码 结果示例:
4、按日志级别分割日志
按日志级别分割日志,可以将错误信息单独写入一个文件。
方法为:新建hook时,将差别日志级别匹配到差别的writer,如下:
- // 新建Hook,按日志级别匹配 writer
- hook := lfshook.NewHook(
- lfshook.WriterMap{
- logrus.DebugLevel: logWriter,
- logrus.InfoLevel: logWriter,
- logrus.WarnLevel: logWriter,
- logrus.ErrorLevel: errorWriter,
- },
- &logrus.TextFormatter{
- TimestampFormat: "2006-01-02 15:04:05",
- },
- )
复制代码 完整代码:
- package main
- import (
- "io"
- "path/filepath"
- "time"
- rotatelogs "github.com/lestrrat-go/file-rotatelogs"
- "github.com/rifflock/lfshook"
- "github.com/sirupsen/logrus"
- )
- func main() {
- // 创建一个 writer
- logWriter, err := rotatelogs.New(
- filepath.Join("logs", "syslog_%Y%m%d%H%M%S.log"), //日志路径
- rotatelogs.WithLinkName(filepath.Join("logs", "syslog.log")),
- rotatelogs.WithMaxAge(7*24*time.Hour), // 最大保留天数:7天
- rotatelogs.WithRotationTime(10*time.Second), // 日志分割时间:10s
- )
- if err != nil {
- panic(err)
- }
- // 创建一个 Error 级别的 writer
- errorWriter, err := rotatelogs.New(
- filepath.Join("logs", "sysError_%Y%m%d%H%M%S.log"), //日志路径
- rotatelogs.WithLinkName(filepath.Join("logs", "sysError.log")),
- rotatelogs.WithMaxAge(7*24*time.Hour), // 最大保留天数:7天
- rotatelogs.WithRotationTime(10*time.Second), // 日志分割时间:1分钟
- )
- if err != nil {
- panic(err)
- }
- // 新建Hook,按日志级别匹配 writer
- hook := lfshook.NewHook(
- lfshook.WriterMap{
- logrus.DebugLevel: logWriter,
- logrus.InfoLevel: logWriter,
- logrus.WarnLevel: logWriter,
- logrus.ErrorLevel: errorWriter,
- },
- &logrus.TextFormatter{
- TimestampFormat: "2006-01-02 15:04:05",
- },
- )
- // 创建一个 logger
- logger := logrus.New()
- logger.SetReportCaller(true)
- logger.SetOutput(io.Discard)
- // 注册 hook
- logger.AddHook(hook)
- // 记录日志
- for i := 0; i < 10; i++ {
- logger.Info("Hello world!!")
- logger.Error("这是报错信息")
- time.Sleep(3 * time.Second)
- }
- }
复制代码 结果示例:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |