Go log包需封装实现分级日志:用SetFlags启用时间戳与文件行号,SetOutput重定向至文件,封装LogError添加ERROR前缀,可选debug.Stack()追加调用栈。

Go 标准库的 log 包本身不区分日志级别(如 debug/info/warn/error),但可以灵活封装,实现带时间、文件名、行号的错误日志记录。关键在于:用 log.SetFlags 控制输出格式,用 log.SetOutput 重定向到文件,再配合 runtime.Caller 获取调用位置。
默认 log 输出只有内容,缺少上下文。启用 LstdFlags | Lshortfile 可自动添加时间戳和文件:行号:
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("something went wrong") // 输出类似:2024/05/20 10:30:45 main.go:12: something went wrong
注意:Lshortfile 显示的是调用 log.Println 的位置,不是错误发生的原始位置——这对快速定位已足够。
为避免每次手动写 "ERROR: ",可封装一个 LogError 函数:
立即学习“go语言免费学习笔记(深入)”;
log.Printf 支持格式化,如变量插值"ERROR" 前缀,便于 grep 过滤LstdFlags | Lshortfile 标志func LogError(v ...interface{}) {
log.Printf("ERROR: %v", v...)
}
// 使用
if err != nil {
LogError("failed to open config:", err)
}
将日志持久化是生产环境必需步骤:
os.OpenFile 以 os.O_CREATE | os.O_APPEND | os.O_WRONLY 模式打开日志文件log.SetOutput 替换默认输出目标main() 开头尽早初始化,确保所有日志都被捕获file, err := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
if err != nil {
log.Fatal("failed to open log file:", err)
}
log.SetOutput(file)
defer file.Close() // 注意:仅在程序退出前关闭,不要在初始化后立刻 defer
标准 log 不打印堆栈,但可通过 debug.PrintStack() 或第三方包(如 github.com/pkg/errors)增强。若坚持用原生方式,可手动捕获:
import "runtime/debug"
func LogErrorWithStack(v ...interface{}) {
log.Printf("ERROR: %v\n%s", v, debug.Stack())
}
⚠️ 注意:频繁调用 debug.Stack() 性能开销较大,仅建议在关键错误或调试阶段使用。
不复杂但容易忽略:日志路径权限、文件轮转、多 goroutine 安全(log 默认是并发安全的,无需额外加锁)。
以上就是如何使用Golang记录错误日志_结合log包输出错误信息的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号