
Go 标准库的 log 包默认会在每条日志前自动添加 YYYY/MM/DD HH:MM:SS 格式的时间戳;若需纯文本无时间戳日志,应创建自定义 *log.Logger 实例并将其 Flags 设为 0。
go 标准库的 `log` 包默认会在每条日志前自动添加 `yyyy/mm/dd hh:mm:ss` 格式的时间戳;若需纯文本无时间戳日志,应创建自定义 `*log.logger` 实例并将其 `flags` 设为 `0`。
Go 的 log 包提供了一个全局 logger(通过 log.Println 等函数使用),其行为由三个核心属性控制:输出目标(Output)、前缀(Prefix) 和 标志位(Flags)。其中,Flags 决定了是否自动注入时间、文件名、行号等元信息。默认值为 log.Ldate | log.Ltime,因此每次调用 log.Println 都会前置标准时间戳。
你原代码中调用 log.SetOutput(file) 仅修改了输出目标,但未改变 log 包全局 logger 的 Flags,因此时间戳依然保留。
✅ 正确做法是:*避免使用全局 logger,而是显式创建一个独立的 `log.Logger实例,并将Flags设为0`**:
package main
import (
"log"
"os"
"syscall"
)
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)
}
func main() {
logMessage("foo")
logMessage("bar")
}
⚠️ 注意事项:
-
os.O_RDWR|O_APPEND写法有误:O_RDWR与O_APPEND冲突(O_APPEND要求以O_WRONLY或O_RDWR打开,但实际追加写必须确保写入权限,推荐使用os.O_WRONLY | os.O_APPEND | os.O_CREATE); - 文件权限应显式指定(如
0644),否则在某些系统上可能因 umask 导致不可读; -
defer file.Close()在循环或多次调用中不适用——它会在函数返回时关闭文件,而你的logMessage每次都重新打开文件,效率低且易触发“too many open files”错误。生产环境建议复用*os.File或使用带同步机制的 logger(如log.New(…)+ 全局文件句柄); - 若需更灵活控制(如添加自定义前缀、JSON 格式、多级日志),推荐使用成熟日志库(如
zap、zerolog),而非手动定制标准库。
总结:Go 日志的时间戳由 log.Logger.Flags 控制;禁用时间戳的关键不是“改写日志内容”,而是构造一个 Flags=0 的新 logger——这是符合 Go 设计哲学的轻量、安全、可组合的解决方案。










