【问题标题】:Docker Logs not ReadableDocker 日志不可读
【发布时间】:2020-01-25 14:58:20
【问题描述】:

当我使用以下命令转储容器的 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 = Request Execution not successful for the following details : 网址 = http://localhost:31201/swagger

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

【问题讨论】:

    标签: docker logging dump


    【解决方案1】:

    不直观docker logs只是输出容器入口点/命令的标准输出。

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

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

    【讨论】:

    • 感谢您的回复,但是 docker 命令没有类似的标签可以阻止这些转义字符。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您提供的信息,我相信该命令可以在 linux 机器上运行,但我在没有 sed 命令可用的 windows 机器上运行 docker。你有其他的windows机器替代品吗
    • 安装 Git。启动 Git Bash。使用 sed 和大多数其他标准 linux 命令。
    【解决方案3】:

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

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

    使用正则表达式

    以下是去除 ANSI 颜色代码的标准正则表达式(Linux 和 Windows 均可使用)

    '\x1b\[[0-9;]*m'
    
    • \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 指的是 pipped 流中的每个对象,而 $_ 指的是当前对象。

    上述命令将从输出流中删除[1;35m[0m[1;3^[[37mABC等特殊字符。

    【讨论】:

      【解决方案4】:

      对于遇到这种情况的任何人,我的情况是由于运行命令具有 -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
      

      没有(注意使用的命令外壳在没有 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
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2018-12-26
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-14
          • 2021-04-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多