Golang日志库使用指南:求指导
Golang日志库使用指南:求指导 大家好,
我正在为我的项目寻找一些关于日志库的指导。需求如下:
- 日志可以定向到某个文件
- 日志应该按天轮转。轮转时的文件名应基于日期可配置,以便我们轻松查阅
- 日志应该能够基于日志文件的大小/行数进行轮转
- 除了要打印的消息外,还应打印文件名或函数名以及日期时间
- 应具备日志级别
我尝试使用了 log4go “https://github.com/jeanphorn/log4go”,虽然能收到消息,但对轮转部分不太满意。第2点和第4点功能无法正常工作。
此致 Rajesh
4 回复
我不确定是否理解正确,但如果你还没尝试过 https://github.com/sirupsen/logrus 的话,可以试试看
更多关于Golang日志库使用指南:求指导的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
另外,当你在查看日志时……这个可能会有所帮助 https://godoc.org/github.com/kr/logfmt 
哦,logrus 默认就支持 logfmt 格式 😉 太棒了
对于你的需求,我推荐使用 lumberjack 配合标准库 log 或第三方库如 logrus 来实现。lumberjack 提供了强大的日志轮转功能,而 logrus 则支持结构化日志和级别。以下是具体实现:
-
安装依赖:
go get github.com/sirupsen/logrus go get gopkg.in/natefinch/lumberjack.v2 -
代码示例:
package main import ( "os" "path/filepath" "runtime" "github.com/sirupsen/logrus" "gopkg.in/natefinch/lumberjack.v2" ) func main() { // 配置 lumberjack 用于日志轮转 logRotator := &lumberjack.Logger{ Filename: "/var/log/myapp/app.log", // 日志文件路径 MaxSize: 100, // 单个文件最大大小(MB) MaxBackups: 30, // 保留的旧文件最大数量 MaxAge: 28, // 保留旧文件的最大天数 Compress: true, // 是否压缩旧文件 LocalTime: true, // 使用本地时间命名轮转文件 } // 配置 logrus log := logrus.New() log.SetOutput(logRotator) // 设置输出到文件 log.SetFormatter(&logrus.TextFormatter{ FullTimestamp: true, // 显示完整时间戳 TimestampFormat: "2006-01-02 15:04:05", // 自定义时间格式 CallerPrettyfier: func(f *runtime.Frame) (string, string) { // 获取文件名和函数名,简化路径 filename := filepath.Base(f.File) return "", filename + ":" + f.Function }, }) log.SetReportCaller(true) // 启用报告调用者信息 // 设置日志级别(例如 InfoLevel) log.SetLevel(logrus.InfoLevel) // 示例日志记录 log.Info("This is an info message with file and function details.") log.Warn("This is a warning message.") }
关键点说明:
- 日志定向和轮转:
lumberjack.Logger处理文件输出和轮转,基于大小(MaxSize)、时间(MaxAge)和备份数量(MaxBackups)。轮转文件会自动按日期命名(如app-2023-10-05.log),通过LocalTime: true使用本地时间。 - 日志内容:
logrus.TextFormatter配置了时间戳和调用者信息(文件名和函数名),通过SetReportCaller(true)启用。 - 日志级别:
logrus支持Debug、Info、Warn、Error等级别,通过SetLevel设置。
如果你偏好标准库,可以使用 log 结合 lumberjack,但需要手动处理级别和格式:
package main
import (
"log"
"os"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logRotator := &lumberjack.Logger{
Filename: "/var/log/myapp/std.log",
MaxSize: 100,
MaxBackups: 30,
MaxAge: 28,
Compress: true,
LocalTime: true,
}
log.SetOutput(logRotator)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) // 包含日期、时间、文件名
log.Println("Standard log message with file info.")
}
这使用 log.Lshortfile 来包含文件名和行号,但函数名需要额外处理(标准库不支持直接输出函数名)。
以上方案满足你的所有需求,且轮转可靠。如果遇到问题,检查文件权限和路径是否正确。

