zerolog通过nohup运行生成的nohup.out日志是什么格式?如何转为可读格式?
问题原因解释
你看到的nohup.out里带[90m、[0m这类特殊符号的内容是 ANSI转义序列,是终端用来控制文本颜色、样式的控制字符:
- 直接在终端执行
go run main.go时,输出目标是交互式终端(TTY),终端会自动识别并解析这些转义序列,把对应的字段渲染成彩色(比如DBG级别是黄色、INF级别是绿色、时间戳是灰色),因此你看不到原始的转义码,只会看到格式化后的干净日志。 - 用
nohup运行时,程序的标准输出/标准错误被重定向到了nohup.out文件,不是交互式终端,转义序列不会被解析,会被原样写入文件,所以直接打开文件就会看到这些看起来像乱码的控制字符。
zerolog的ConsoleWriter默认不会自动根据输出目标类型禁用颜色输出,所以才会出现两种运行场景下日志格式不一致的问题。
解决方案
方案1:代码层面强制统一无颜色格式(推荐)
直接在初始化ConsoleWriter的时候显式设置NoColor: true,强制禁用ANSI颜色输出,不管输出到终端还是文件,格式都会完全一致:
func init() { zerolog.SetGlobalLevel(zerolog.DebugLevel) zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs // 新增NoColor: true配置 log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339Nano, NoColor: true}) }
如果你希望在终端运行时保留彩色输出,仅在输出到文件/非TTY场景下禁用颜色,可以增加TTY检测逻辑动态设置NoColor的值即可。
方案2:处理已生成的nohup.out文件
如果不需要修改代码,只是要查看已生成的带转义序列的日志,可以用下面两种方法:
- 直接用
cat nohup.out命令在终端查看,终端会自动解析转义序列,展示和直接运行时一致的彩色日志 - 如果需要提取纯文本无样式的日志,可以用
ansi2txt这类转义工具处理文件,过滤掉所有ANSI控制码:ansi2txt < nohup.out > clean_log.log
内容的提问来源于stack exchange,提问作者JayB Kim
相关产品推荐
相关产品推荐

