如何对齐Golang logger输出的代码位置与日志消息列?
Golang日志文件名对齐解决方案
标准库log的Lshortfile/Llongfile标识是直接拼接文件名和行号到日志开头,没有预留补空格的逻辑,默认无法实现消息垂直对齐,可通过以下两种方案实现:
方案1:基于标准库自定义封装(无第三方依赖)
自己封装日志方法,手动获取调用栈的文件名和行号,固定宽度格式化后再输出:
package main import ( "fmt" "log" "os" "path" "runtime" ) var logger *log.Logger // 可根据项目实际最长文件名调整该宽度 const fileFieldMaxWidth = 25 func init() { // 关闭默认的文件标识,由自己格式化拼接 logger = log.New(os.Stderr, "", 0) } func LogPrintln(msg string) { _, filePath, line, ok := runtime.Caller(1) if ok { fileName := path.Base(filePath) fileInfo := fmt.Sprintf("%s:%d", fileName, line) // 左对齐补空格到指定宽度 formattedFileInfo := fmt.Sprintf("%-*s", fileFieldMaxWidth, fileInfo) logger.Println(formattedFileInfo + msg) return } logger.Println(msg) } func main() { LogPrintln("From main") SomeFunction() }
afilewithalongname.go对应修改调用方法即可:
package main func SomeFunction() { LogPrintln("From function") }
调整后输出效果如下,消息已经垂直对齐:
$ go run . main.go:28: From main afilewithalongname.go:4: From function
方案2:使用第三方日志库
如果项目有日志分级、结构化输出等其他需求,推荐直接使用成熟的第三方日志库,比如Zap、Logrus,这类库原生支持自定义字段格式化、对齐配置,不需要手动处理调用栈逻辑,可直接通过配置项开启字段对齐。
内容的提问来源于stack exchange,提问作者ymudyruc
相关产品推荐
相关产品推荐

