Docker 日志不可读

Docker Logs not Readable

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

docker logs containername > containername.log

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

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

输出示例:

Hosting environment: Production Content root path: /app Now listening on: http://[::]:80 Application started. Press Ctrl+C to shut down. [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[36mRequest starting 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 = Request Execution not successful for the following details : URL = http://localhost:31201/swagger

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

非直觉docker logs只是输出容器entrypoint/command的标准输出。

您在输出中得到的是 shell 解释器上 set text style(字体颜色和前景)的特殊 ANSI 字符。通常,这对日志文件或将其显示为纯文本不友好。

一些应用程序可以选择以纯文本(无特殊字符)输出(例如:docker-compose logs --no-colors)。

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

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

docker logs containername | sed $'s/[^[:print:]\t]//g' > containername.log

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

上面的一个答案告诉我要使用仅在 Unix 上可用的 sed 实用程序,我对 Windows 系统有特殊要求。对于 windows 系统,我使用了作为 Powershell 3 的一部分提供的替换命令。0.The powershell 使用有助于替换 ANSI 颜色代码的正则表达式。

使用正则表达式

下面是用于删除 ANSI 颜色代码的标准正则表达式(可用于 Linux 和 windows 两者)

'\x1b\[[0-9;]*m'
  • \x1b(或\x1B)是转义特殊字符
    sed 不支持替代 \e3
  • \[是转义序列的第二个字符
  • [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 等特殊字符。

对于遇到此问题的任何人,我的情况是由于 运行 命令具有 -tty,因此删除它会删除特殊字符,使用 TTY ...

2021-01-13T02:32:19.4743079Z [01/13/2021 15:32:19] docker run --tty --volume C:\Users\agent:C:/solution/home microlith_master_push:294 deploy.bat Test

2021-01-13T02:32:20.9345011Z [2J[?25l[m[H
2021-01-13T02:32:21.0359039Z [H]0;C:\Windows\system32\cmd.exe[?25h[?25l[deploy.bat] ExecutionPolicy ByPass ... 
2021-01-13T02:32:21.0360194Z [?25h[?25l

without(注意细微差别,使用的命令 shell 在没有 TTY 的情况下不会被记录)

2021-01-13T03:40:51.1535448Z [01/13/2021 16:40:51] docker run --volume C:\Users\agent:C:/solution/home microlith_master_push:298 deploy.bat Test

2021-01-13T03:40:52.4624483Z [deploy.bat] ExecutionPolicy ByPass ...

注意:如果应用程序本身使用 ANSI 代码,这些代码仍然会通过,例如MuleSoft AnyPoint CLI

2021-01-13T03:41:16.4235891Z [01/13/2021 16:41:16] anypoint-cli runtime-mgr cloudhub-application modify --runtime 4.3.0 api-c-0.1.3.jar --output table

2021-01-13T03:41:20.8002477Z Updating api-c-Test ...
2021-01-13T03:41:49.9849592Z [90m┌──────────────────────────────[39m[90m┬────────────────────────────────────────────────────────────────┐[39m
2021-01-13T03:41:49.9850811Z [90m│[39m Domain                       [90m│[39m api-c-test.us-e1.cloudhub.io                                   [90m│[39m
2021-01-13T03:41:49.9851873Z [90m├──────────────────────────────[39m[90m┼────────────────────────────────────────────────────────────────┤[39m
2

docker build --progress plain 适用于 docker 构建。