Docker 日志不可读

Shu*_*ogi 8 logging dump docker

当我使用以下命令转储容器的 docker 日志时

docker 日志容器名称 > 容器名称.log

为文件生成的输出难以阅读和理解 - 未提及日志日期 - 添加了未知的转义字符

我不确定是否需要在上述命令中添加一些额外选项来转储日志,或者我的理解存在更大的差距。

输出示例:

托管环境:生产内容根路径:/app 现在监听:http://[::]:80 应用程序已启动。按 Ctrl+C 关闭。[39;49m[30m[[39;49m[39;49m[37m11:21:25.208 +00:00[39;49m[39;49m[30m]39;49m[39;49m[37mINF[39;49m[ 39;49m[30m] [39;49m[39;49m[36m请求开始 HTTP/1.1 GET http://localhost:31201/swagger [39;49m

[39;49m[30m[[39;49m[39;49m[37m11:21:25.943 +00:00[39;49m[39;49m[30m]39;49m[39;49m[37m[39;49m[ 37m[41mERR[39;49m[39;49m[30m]] [39;49m[39;49m[37mLevel = ErrorMessage = 以下详细信息的请求执行不成功: URL = http://localhost:31201/swagger

我可以使用 docker log 命令清楚地看到输出。我不确定为什么这些特殊字符被添加到输出中。

BMi*_*tch 6

该输出来自希望写入 tty 的应用程序。这可能是您可以更改的应用程序配置。它还可能检测他们的输入何时是 tty,您可以使用 docker 进行切换(该-t标志或tty在默认为关闭的撰写文件中)。

如果您无法修改容器或应用程序以避免打印控制字符,那么您可以尝试使用 sed 命令将它们删除:

docker logs containername | sed $'s/[^[:print:]\t]//g' > containername.log
Run Code Online (Sandbox Code Playgroud)


Shu*_*ogi 3

感谢上面的回答帮助我找到了最终的解决方案。

上面的答案之一告诉我们使用仅在 Unix 上可用的sed实用程序,而我对 Windows 系统有特殊要求。对于 Windows 系统,我使用了 Powershell 3.0 中提供的 Replace 命令。powershell 使用正则表达式来帮助替换 ANSI 颜色代码。

使用正则表达式

下面是删除 ANSI 颜色代码的标准正则表达式(可在 Linux 和 Windows 中使用)

'\x1b\[[0-9;]*m'
Run Code Online (Sandbox Code Playgroud)
  • \x1b(或\x1B) 是转义特殊字符
    sed不支持替代\e\033
  • \[是转义序列的第二个字符
  • [0-9;]*是颜色值正则表达式
  • m是转义序列的最后一个字符

最终命令

docker logs container | ForEach-Object { $_ -replace '\x1b\[[0-9;]*m','' }| Out-File -FilePath .\docker-logs.log

  • ForEach-Object 指的是管道流中的每个对象,$_ 指的是当前对象。

上面的命令将从输出流中删除特殊字符,例如[1;35m,[0m[1;3和。^[[37mABC