【问题标题】:How to differentiate stdout logs?如何区分标准输出日志?
【发布时间】:2020-01-09 15:26:41
【问题描述】:

我们有一个在 docker 上运行的应用程序;目前所有日志都被写入日志文件。我们想将日志移动到stdout。我们已经使用/dev/fd/1 将日志写入stdout,它正在工作。

应用 A 有以下日志:

nginx log 
supervisor log
app-supervisor log

nginx 配置,变化如下:

access_log /dev/fd/1 main;
error_log /dev/fd/1 error;

supervisor 配置中,变化如下:

stdout_logfile=/dev/fd/1

样品主管:

[program:app]
command=/bin/bash -c "exec npm run start-generic"
directory=/app01
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
autostart=true
autorestart=true
startretries=0
stopasgroup=true

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

现在的问题是所有日志都被写入stdout。我想区分这些日志(即在它们来自的每一行前面放置一些标识符)。

如下所示:

[app] .....app log line1...
[app] .....app log line2...
[nginx] ....nginx log line1...
[app] .....app log line3...
[nginx] ....nginx log line2...

【问题讨论】:

    标签: docker stdout supervisord


    【解决方案1】:

    这并不能完全回答问题,但我建议使用 docker-compose。在 docker-compose 下将应用程序的所有组件创建为服务。现在,当您使用docker-compose up 启动它时,您不仅可以获得根据服务标记的不同日志,而且还可以方便地以更简单的方式单独管理它们。

    【讨论】:

    • 感谢您的建议,但是我们不能使用 docker compose,因为我们所有的应用程序都在 AWS ECS 上运行。
    • 这个答案仍然正确地表明你不应该首先在一个容器中运行所有组件
    【解决方案2】:

    如果其他人正在寻找答案 -

    你可以使用supervisor stdout事件监听器——

    [supervisord]
    nodaemon = true    << make it true 
    
    [program:web]
    command = ...
    stdout_events_enabled = true.       <<< add these lines in your each program config
    stderr_events_enabled = true        <<< add these lines in your each program config
    
    [eventlistener:stdout]
    command = supervisor_stdout
    buffer_size = 100
    events = PROCESS_LOG
    result_handler = supervisor_stdout:event_handler
    
    

    这将在每行前面附加程序名称。但是我在使用这个时看到了日志重复。

    或 如果您不想使用事件侦听器并且不想更改代码,则可以使用 tail 程序来跟踪日志并使用 sed 附加一些文本。

    假设下面是你的配置 -

    [program:app]
    command=/bin/bash -c "exec npm run start-generic"
    directory=/app01
    stdout_logfile=/logs/app.log
    stdout_logfile_maxbytes=50
    autostart=true
    autorestart=true
    startretries=0
    stopasgroup=true
    
    [program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"
    logfile = /logs/nginx.log
    stdout_logfile_maxbytes=50
    
    

    然后在配置中添加尾部作业以写入标准输出并在其前面附加字符串 -

    [program:nginx-log-access]
    command=/bin/bash -c "tail -f /logs/nginx.log | sed 's/^/[nginx-access] /'"
    stdout_logfile=/dev/stdout
    stdout_logfile_maxbytes=0
    
    [program:nginx-log-error]
    command=/bin/bash -c "tail -f /logs/nginx-error.log | sed 's/^/[nginx-error] /'"
    stdout_logfile=/dev/stdout
    stdout_logfile_maxbytes=0
    
    [program:app-log]
    command=/bin/bash -c "tail -f /logs/app.log | sed 's/^/[app-access] /'"
    stdout_logfile=/dev/stdout
    stdout_logfile_maxbytes=0
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2018-05-22
      • 2016-11-14
      • 2014-04-10
      • 2018-04-02
      • 2016-09-24
      • 2021-07-03
      • 2018-02-28
      相关资源
      最近更新 更多