
Go 标准库的 log 包默认在每条日志前自动添加当前时间戳;若需纯文本日志(如仅记录消息内容),可通过创建自定义 *log.Logger 实例并设置 flag 为 0 来禁用时间、文件名等所有前缀。
go 标准库的 `log` 包默认在每条日志前自动添加当前时间戳;若需纯文本日志(如仅记录消息内容),可通过创建自定义 `*log.logger` 实例并设置 `flag` 为 `0` 来禁用时间、文件名等所有前缀。
在 Go 中,log.Println() 等函数之所以自动输出类似 2017/03/21 03:34:42 foo 的格式,是因为标准 log 包的全局 logger 默认启用了 Ldate | Ltime 标志(即 log.LstdFlags = Ldate | Ltime)。每次调用 log.SetOutput() 并不重置标志位——它只改变输出目标,而时间戳等前缀由 log.Flags() 控制。
你原代码的问题在于:
✅ 正确地将输出重定向到文件;
❌ 但未修改日志标志(flags),因此仍沿用默认的 Ldate | Ltime,导致每行自动添加时间戳。
✅ 正确做法:使用 log.New() 创建无前缀 Logger
func logMessage(message string) {
file, err := os.OpenFile("my.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
defer file.Close()
// 创建新 logger:空前缀("")、flags=0(禁用所有自动前缀)
logger := log.New(file, "", 0)
logger.Println(message)
}
⚠️ 注意:
os.O_CREATE|os.O_RDWR|os.O_APPEND中的os.O_RDWR是冗余且不推荐的——写日志只需os.O_WRONLY;同时应显式指定权限(如0644),避免在不同系统上因 umask 导致文件不可读。
? 标志位说明(来自 log 包常量)
-
log.Ldate→2009/01/23 -
log.Ltime→01:23:23 -
log.Lmicroseconds→01:23:23.123123 -
log.Llongfile/log.Lshortfile→ 文件位置 -
0→ 完全禁用所有前缀,仅输出原始消息
✅ 验证效果
调用:
logMessage("foo")
logMessage("bar")
生成 my.log 内容为:
foo bar
干净、无时间戳、可直接用于结构化日志或与外部日志系统集成。
? 进阶建议
- 若需保留部分前缀(如仅 PID 或自定义标签),可组合 flags:
log.LstdFlags ^ log.Ltime(移除时间)或log.Lmicroseconds | log.Lshortfile; - 生产环境推荐使用
zap、zerolog等高性能结构化日志库,但标准库log.New(..., "", 0)已足够满足轻量级无格式日志需求。










