目录
首先,使用以下命令安装 以下是一个简单的 钩子可以用于将日志发送到其他系统(如 Elasticsearch、Slack 等)。以下是一个简单的钩子示例: 可以将日志输出到文件,而不是标准输出。 可以创建多个日志实例,用于不同的模块或功能。 可以使用 默认情况下,
logrus
是 Go 语言中一个非常流行的结构化日志库,提供了丰富的日志功能,包括日志级别、字段绑定、钩子(Hooks)等。以下是 logrus
的基本使用方法。
1. 安装 logrus
logrus
:go get github.com/sirupsen/logrus
2. 基本用法
logrus
使用示例:package main
import (
"github.com/sirupsen/logrus"
)
func main() {
// 设置日志格式为 JSON
logrus.SetFormatter(&logrus.JSONFormatter{})
// 设置日志级别
logrus.SetLevel(logrus.InfoLevel)
// 记录日志
logrus.Info("This is an info message")
logrus.Warn("This is a warning message")
logrus.Error("This is an error message")
}
输出示例
{"level":"info","msg":"This is an info message","time":"2023-10-05T14:30:45Z"}
{"level":"warning","msg":"This is a warning message","time":"2023-10-05T14:30:45Z"}
{"level":"error","msg":"This is an error message","time":"2023-10-05T14:30:45Z"}
3. 日志级别
logrus
支持以下日志级别:
logrus.TraceLevel
logrus.DebugLevel
logrus.InfoLevel
logrus.WarnLevel
logrus.ErrorLevel
logrus.FatalLevel
logrus.PanicLevel
设置日志级别
logrus.SetLevel(logrus.DebugLevel)
记录不同级别的日志
logrus.Trace("This is a trace message")
logrus.Debug("This is a debug message")
logrus.Info("This is an info message")
logrus.Warn("This is a warning message")
logrus.Error("This is an error message")
logrus.Fatal("This is a fatal message") // 记录日志后调用 os.Exit(1)
logrus.Panic("This is a panic message") // 记录日志后调用 panic()
4. 添加字段
logrus
支持在日志中添加结构化字段,方便后续分析和过滤。logrus.WithFields(logrus.Fields{
"user_id": 123,
"event": "login",
}).Info("User logged in")
输出示例
{"event":"login","level":"info","msg":"User logged in","time":"2023-10-05T14:30:45Z","user_id":123}
5. 自定义日志格式
logrus
支持自定义日志格式。以下是使用 TextFormatter
的示例:logrus.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
ForceColors: true,
})
输出示例
INFO[2023-10-05T14:30:45Z] This is an info message
WARN[2023-10-05T14:30:45Z] This is a warning message
ERROR[2023-10-05T14:30:45Z] This is an error message
6. 使用钩子(Hooks)
type MyHook struct{}
func (h *MyHook) Levels() []logrus.Level {
return logrus.AllLevels
}
func (h *MyHook) Fire(entry *logrus.Entry) error {
// 在这里处理日志,例如发送到远程服务器
fmt.Println("Hook fired:", entry.Message)
return nil
}
func main() {
logrus.AddHook(&MyHook{})
logrus.Info("This is an info message")
}
输出示例
Hook fired: This is an info message
{"level":"info","msg":"This is an info message","time":"2023-10-05T14:30:45Z"}
7. 日志输出到文件
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func main() {
// 创建日志文件
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
logrus.Fatal("Failed to open log file:", err)
}
defer file.Close()
// 设置日志输出到文件
logrus.SetOutput(file)
// 记录日志
logrus.Info("This is an info message")
}
8. 使用日志实例
package main
import (
"github.com/sirupsen/logrus"
)
var (
appLog = logrus.New()
authLog = logrus.New()
)
func main() {
// 配置 appLog
appLog.SetFormatter(&logrus.JSONFormatter{})
appLog.SetLevel(logrus.InfoLevel)
// 配置 authLog
authLog.SetFormatter(&logrus.TextFormatter{})
authLog.SetLevel(logrus.DebugLevel)
// 使用日志实例
appLog.Info("Application started")
authLog.Debug("User authentication successful")
}
9. 日志轮转
lumberjack
实现日志轮转(按大小或时间切割日志文件)。安装
lumberjack
go get gopkg.in/natefinch/lumberjack.v2
使用
lumberjack
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 配置日志轮转
logger := &lumberjack.Logger{
Filename: "app.log",
MaxSize: 10, // 日志文件最大大小(MB)
MaxBackups: 3, // 保留的旧日志文件数量
MaxAge: 28, // 保留的旧日志文件天数
Compress: true, // 是否压缩旧日志文件
}
// 设置日志输出到 lumberjack
logrus.SetOutput(logger)
// 记录日志
logrus.Info("This is an info message")
}
10. 性能优化
logrus
的字段是动态分配的,可能会影响性能。可以通过以下方式优化:
logrus.Entry
重用字段。
总结
logrus
是一个功能强大且灵活的日志库,适用于大多数 Go 项目。通过合理配置日志级别、格式、字段和钩子,可以满足复杂的日志需求。如果需要更高级的功能(如日志轮转),可以结合 lumberjack
等工具使用。