logrus日志库学习笔记

logrus 是 Go 语言中一个非常流行和功能强大的日志库。它提供了丰富的功能,支持结构化日志、灵活的日志级别、钩子(hook)、格式化输出等特性,适合用来记录各种类型的日志信息。

logrus 的基本使用

以下是使用 logrus 的一些基本操作示例:

1. 安装 logrus

使用 go get 命令安装 logrus

1
go get github.com/sirupsen/logrus

2. 基本日志记录

logrus 支持不同级别的日志记录,如 InfoWarnErrorDebug 等。以下是一个简单的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package main
import (
    "github.com/sirupsen/logrus"
)
func main() {
    logrus.Info("This is an info message")
    logrus.Warn("This is a warning message")
    logrus.Error("This is an error message")
    logrus.Debug("This is a debug message") // 默认情况下,Debug 级别日志不会被输出
}

3. 设置日志级别

你可以设置全局的日志级别,低于该级别的日志将不会输出:

1
2
3
4
5
6
7
func main() {
    logrus.SetLevel(logrus.WarnLevel)

    logrus.Info("This message will not be logged")
    logrus.Warn("This is a warning message")
    logrus.Error("This is an error message")
}

4. 格式化日志输出

logrus 支持多种日志输出格式,例如文本和 JSON:

  • 文本格式(默认):
1
2
3
4
5
6
func main() {
    logrus.SetFormatter(&logrus.TextFormatter{
        FullTimestamp: true,
    })
    logrus.Info("This is a text formatted log")
}
  • JSON 格式
1
2
3
4
func main() {
    logrus.SetFormatter(&logrus.JSONFormatter{})
    logrus.Info("This is a JSON formatted log")
}

5. 自定义字段

logrus 支持结构化日志,可以在日志中添加自定义字段:

1
2
3
4
5
6
func main() {
    logrus.WithFields(logrus.Fields{
        "user_id": 12345,
        "event":   "user_login",
    }).Info("User login event")
}

6. 输出到文件

你可以将日志输出到文件,而不是标准输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import (
    "os"
)

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

    logrus.Info("This log will be written to the file")
}
1
2
// 将日志输出设置为同时写入文件和标准输出
logrus.SetOutput(io.MultiWriter(file, os.Stdout))

7. 钩子(Hooks)

logrus 支持钩子,可以在日志记录前后执行一些自定义操作,比如将日志发送到远程服务器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
type MyCustomHook struct{}

func (hook *MyCustomHook) Levels() []logrus.Level {
    return logrus.AllLevels
}

func (hook *MyCustomHook) Fire(entry *logrus.Entry) error {
    // 在这里可以将日志发送到远程服务器或做其他操作
    fmt.Println("Custom hook fired for log:", entry.Message)
    return nil
}

func main() {
    logrus.AddHook(&MyCustomHook{})

    logrus.Info("This log will trigger the custom hook")
}

常见场景使用

  1. 记录 HTTP 请求日志:可以使用 logrus 记录 HTTP 请求的相关信息,比如方法、路径、状态码等。

  2. 分环境日志输出:可以根据不同的环境(开发、测试、生产)配置不同的日志级别和输出格式。

  3. 集成第三方日志系统:通过钩子将日志发送到诸如 ELK、Splunk、Datadog 等日志系统进行集中管理和分析。

参数和选项配置

在使用 logrus 时,有多种参数和选项可以配置,以满足不同的日志记录需求。这些设置涵盖了日志格式、日志级别、输出目标等多个方面。

1. 日志级别(Log Level)

你可以设置 logrus 的全局日志级别,只有等于或高于该级别的日志才会输出:

1
logrus.SetLevel(logrus.WarnLevel)

常用的日志级别有(依次降低):

  • logrus.PanicLevel:记录 Panic 日志并触发 panic
  • logrus.FatalLevel:记录 Fatal 日志并调用 os.Exit(1) 退出程序。
  • logrus.ErrorLevel:记录错误日志。
  • logrus.WarnLevel:记录警告日志。
  • logrus.InfoLevel:记录信息性日志。
  • logrus.DebugLevel:记录调试日志。
  • logrus.TraceLevel:记录更细粒度的调试日志。

logrus 默认的日志级别是 InfoLevel。这意味着在默认情况下,logrus 会记录 Info 级别及更高(WarnErrorFatalPanic)的日志,而不会输出低于 InfoLevel 的日志(如 DebugTrace 级别的日志)。

2. 日志格式(Formatter)

logrus 支持不同的日志格式,可以通过 SetFormatter 方法来设置。

2.1 文本格式(TextFormatter)

这是 logrus 的默认格式器,适合人类阅读。

1
2
3
logrus.SetFormatter(&logrus.TextFormatter{
    FullTimestamp: true, // 启用完整时间戳
})

TextFormatter 的常用参数:

  • DisableColors: 禁用输出的颜色(默认为 false)。
  • FullTimestamp: 启用完整时间戳(默认为 false,即只显示时间)。
  • TimestampFormat: 自定义时间戳格式,默认是 time.RFC3339
  • DisableTimestamp: 禁用时间戳输出。
  • ForceQuote: 强制对字段进行引用。

2.2 JSON 格式(JSONFormatter)

适合机器处理或日志收集系统使用。

1
2
3
logrus.SetFormatter(&logrus.JSONFormatter{
    TimestampFormat: time.RFC3339, // 自定义时间格式
})

JSONFormatter 的常用参数:

  • TimestampFormat: 自定义时间戳格式。
  • PrettyPrint: 美化输出的 JSON,便于调试(默认为 false)。
  • DisableHTMLEscape: 禁用 HTML 字符转义。

3. 输出目标(Output)

默认情况下,logrus 将日志输出到标准输出(os.Stdout),你可以使用 SetOutput 方法改变输出目标,如输出到文件或其他日志处理器。

1
2
3
4
5
6
file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
    logrus.SetOutput(file)
} else {
    logrus.Error("Failed to log to file, using default stderr")
}

4. 钩子(Hooks)

logrus 支持钩子机制,可以在日志事件发生前或发生后执行特定的操作。你可以使用钩子来将日志发送到外部服务,如 Logstash、Sentry 等。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
type MyCustomHook struct{}

func (hook *MyCustomHook) Levels() []logrus.Level {
    return logrus.AllLevels
}

func (hook *MyCustomHook) Fire(entry *logrus.Entry) error {
    // 处理日志条目
    fmt.Println("Custom hook executed for log:", entry.Message)
    return nil
}

logrus.AddHook(&MyCustomHook{})

5. 字段(Fields)

logrus 支持结构化日志,可以在日志中添加自定义字段,使用 WithFields 方法:

1
2
3
4
logrus.WithFields(logrus.Fields{
    "user_id": 12345,
    "event":   "user_login",
}).Info("User login event")

6. 其他配置

  • logrus.SetReportCaller(true): 启用该选项后,日志会记录产生日志的函数和文件位置。需要注意的是,这会增加一定的性能开销。

    1
    
    logrus.SetReportCaller(true)
  • logrus.SetNoLock(): 禁用日志记录时的锁,这在高并发环境中使用。需要确保你的代码中不会出现并发写日志的情况,否则可能会出现日志混乱的问题。

    1
    
    logrus.SetNoLock()

总结

logrus 提供了丰富的配置选项来满足各种日志需求。常用的配置包括设置日志级别、选择日志格式、指定日志输出目标以及添加钩子和自定义字段。合理利用这些参数,可以使你的日志系统更加灵活和高效。

0%