
Go 标准库的 log 包默认在每条日志前自动添加 YYYY/MM/DD HH:MM:SS 格式的时间戳,这是由日志标志 log.Ldate | log.Ltime 启用的;可通过创建自定义 *log.Logger 并将标志设为 0 来完全禁用时间戳及其他前缀。
go 标准库的 `log` 包默认在每条日志前自动添加 `yyyy/mm/dd hh:mm:ss` 格式的时间戳,这是由日志标志 `log.ldate | log.ltime` 启用的;可通过创建自定义 `*log.logger` 并将标志设为 `0` 来完全禁用时间戳及其他前缀。
在你的代码中,调用 log.Println(message) 时实际使用的是 log 包的全局 logger(即 log.std),它默认启用 log.Ldate | log.Ltime 标志——这正是你看到每行日志开头自动出现 2017/03/21 03:34:42 的原因。
要彻底移除时间戳(以及可选的文件名、行号等前缀),不应复用全局 logger,而应显式创建一个独立的 *log.Logger 实例,并将 flags 参数设为 0:
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
logger := log.New(file, "", 0) // 注意:flags = 0
logger.Println(message)
}⚠️ 注意事项:
-
os.O_CREATE|os.O_RDWR|os.O_APPEND中的os.O_RDWR是冗余且不推荐的——写入日志只需os.O_WRONLY;同时务必设置权限(如0644),否则在某些系统上可能因缺少读写权限导致OpenFile失败。 -
defer file.Close()在当前写法中存在隐患:若logMessage被多次调用,每次都会新建 logger 并关闭文件,导致后续写入失败(文件句柄已关闭)。更健壮的做法是复用文件句柄和 logger 实例,例如在包初始化或全局变量中创建一次:
var logger *log.Logger
func init() {
file, err := os.OpenFile("my.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
logger = log.New(file, "", 0)
}
func logMessage(message string) {
logger.Println(message)
}✅ 总结:Go 日志的时间戳由 log 包的 flags 控制,而非 log.Println 自身逻辑;禁用前缀的核心是使用 log.New(output, prefix, flags) 并将 flags 设为 0。这是实现轻量、结构化或与其他日志系统(如 JSON 日志)集成的基础步骤。

















