Как отличить логи стандартного вывода? - PullRequest
0 голосов
/ 09 января 2020

У нас есть приложение, работающее на Docker; в настоящее время все журналы записываются в файлы журналов. Мы хотим переместить журналы на stdout. Мы использовали /dev/fd/1 для записи журналов в stdout, и он работает.

Приложение A имеет следующие журналы:

nginx log 
supervisor log
app-supervisor log

nginx config , это изменение:

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

в supervisor config, это изменение:

stdout_logfile=/dev/fd/1

Пример Supervisor:

[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...

Ответы [ 2 ]

0 голосов
/ 21 января 2020

В случае, если кто-то ищет ответ -

, вы можете использовать функцию прослушивания события 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 для добавления некоторых. text.

Предположим, ниже приведен ваш конфиг -

[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

Затем добавьте хвостовое задание в config, чтобы написать в стандартный вывод и добавить строку перед ним -

[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

0 голосов
/ 09 января 2020

Это не совсем ответ на вопрос, но я бы предложил использовать docker -compose. Создайте все компоненты приложения как сервисы под docker -compose. Теперь, когда вы запускаете его с помощью docker-compose up, вы получаете не только различные журналы, помеченные в соответствии с сервисом, но и удобство управления ими по отдельности и более простым способом.

...