6人参与 • 2025-04-24 • Golang
log
是 go 语言标准库中一个简单的日志库,主要功能包括:
log
包中常用的函数如下:
函数名 | 功能 |
---|---|
log.print | 输出日志 |
log.printf | 格式化输出日志 |
log.println | 输出日志,自动换行 |
log.fatal | 输出日志并调用 os.exit(1) |
log.fatalf | 格式化输出日志并退出 |
log.panic | 输出日志并引发 panic |
log.panicln | 格式化输出日志并引发 panic |
log.setflags | 设置日志格式(日期、时间等) |
log.setoutput | 设置日志输出目标 |
package main import ( "log" "os" ) func main() { // 1. 默认输出到标准错误 log.println("这是一条普通日志") // 2. 格式化输出 name := "alice" age := 30 log.printf("用户 %s 已经 %d 岁了\n", name, age) // 3. 设置日志输出目标为文件 file, err := os.openfile("log.txt", os.o_wronly|os.o_create|os.o_append, 0644) if err != nil { log.fatal(err) } log.setoutput(file) log.println("日志已切换到文件输出") // 4. 设置日志格式(默认包含时间信息) log.setflags(log.lstdflags) //ldate = 1 << iota // 使用本地时区的日期:2009/01/23 //ltime // 使用本地时区的时间:01:23:23 //lmicroseconds // 微秒精度的时间:01:23:23.123123。假设启用了ltime //llongfile // 完整文件名和行号:/a/b/c/d.go:23 //lshortfile // 文件名的最后一部分和行号:d.go:23。覆盖llongfile //lutc // 如果设置了ldate或ltime,则使用utc而不是本地时区 //lmsgprefix // 将“前缀”从行首移动到消息之前 //lstdflags = ldate | ltime // 标准logger的初始值,包含日期和时间 log.println("这是一条包含时间的日志") log.panic("panic\n") //log.fatal("fatal\n") }
优势:
局限:
logrus
是 go 语言中一个功能强大的日志库,主要特点如下:
debug
、info
、warning
、error
、fatal
、panic
text
和 json
lumberjack
包)以下是 logrus
的核心功能:
1 .多日志级别
logger.debug("调试日志") logger.info("信息日志") logger.warn("警告日志") logger.error("错误日志") logger.fatal("致命错误") logger.panic("panic 日志")
2. 格式化输出
logger.withfields(logrus.fields{ "username": "alice", "age": 30, }).info("用户信息")
3. 切换输出格式
// 切换到 json 格式 logger.setformatter(&logrus.jsonformatter{}) // 配置日志格式为 text(默认) //logger.setformatter(&logrus.textformatter{})
4.设置日志输出目标
logger.setoutput(os.stdout) // 输出到标准输出
5. 日志轮转(结合 lumberjack)
// 须import( lumberjack "gopkg.in/natefinch/lumberjack.v2" ) writer := &lumberjack.logger{ filename: "logs/app.log", maxsize: 500, // mb maxbackups: 3, maxage: 28, // days compress: true, } logger.setoutput(writer)
以下是一个完整的 logrus
示例代码,包含日志级别、格式化、文件轮转和钩子功能:
package main import ( "log" "os" "os/signal" "syscall" "time" lumberjack "gopkg.in/natefinch/lumberjack.v2" "github.com/sirupsen/logrus" ) func main() { // 1. 创建 logger 实例 logger := logrus.new() // 2. 配置日志级别 logger.setlevel(logrus.infolevel) // 3. 配置日志格式为 json logger.setformatter(&logrus.jsonformatter{}) // 4. 配置日志轮转 writer := &lumberjack.logger{ filename: "logs/app.log", maxsize: 500, // mb maxbackups: 3, maxage: 28, // days compress: true, } logger.setoutput(writer) // 5. 添加钩子(hook) logger.addhook(&myhook{}) // 6. 写入日志 logger.info("这是一个 info 级别的日志") // 7. 带字段的日志 logger.withfields(logrus.fields{ "username": "bob", "age": 25, }).error("用户未找到") // 8. 处理信号 signalchan := make(chan os.signal, 1) signal.notify(signalchan, syscall.sigint, syscall.sigterm) go func() { <-signalchan logger.info("程序已优雅退出") os.exit(0) }() } // 自定义钩子示例 type myhook struct{} func (*myhook) levels() []logrus.level { return []logrus.level{ logrus.infolevel, logrus.errorlevel, } } func (*myhook) fire(entry *logrus.entry) error { // 钩子逻辑:例如发送日志到远程服务器 log.printf("钩子处理:%+v\n", entry) return nil }
1. 何时选择 log
?
2. 何时选择 logrus
?
3. 对比总结
特性 | log | logrus |
---|---|---|
日志级别 | 有限(fatal、error) | 多级别(debug~panic) |
格式化输出 | 支持 | 支持(text/json) |
日志轮转 | 不支持 | 支持(需配合 lumberjack) |
钩子机制 | 不支持 | 支持 |
输出目标 | 标准输出/文件 | 多种(文件、网络等) |
社区和扩展性 | 内置库 | 第三方库,社区丰富 |
到此这篇关于golang 日志log与logrus的文章就介绍到这了,更多相关golang 日志log与logrus内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论