Написання журналів Apache2 до stdout / stderr?


29

Я запускаю Apache2 в контейнері docker і хочу нічого не записувати на диск, записуючи журнали в stdout і stderr. Я бачив кілька різних способів зробити це ( Supervisord і stdout / stderr , журнал доступу Apache до stdout ), але це здається хаками. Чи немає способу зробити це за замовчуванням?

Щоб було зрозуміло, я не хочу хвостити журнал, оскільки це призведе до того, що речі записуються на диск у контейнері.


Чи не хочете ви, щоб ці журнали були легко доступними для усунення несправностей / налагодження? Чому б просто не записати їх на сервер (r) syslog?
HTTP500

@ HTTP500 - Вони потрапляють на зовнішню сторону контейнера докера.
Метт

Якщо ви використовуєте: FROM php: 5.6-apache, що вже включає журнали до stdout та stderr.
Martlark

Відповіді:



25

Як щодо розміщення цього в Dockerfile після встановлення пакета apache2?

RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
    ln -sf /proc/self/fd/1 /var/log/apache2/error.log

Якщо припустити, що це шлях колод. Він призначений для Ubuntu 14.04, а також працює для Ubuntu 16.04.

Примітка: якщо ви впевнені, що символьні посилання є /dev/stdoutчи /proc/stderrє, то ви також можете використовувати їх. Я вважаю за краще шлях до реального файлу, оскільки це гарантовано присутнє.


чудово працює також з Ubuntu 16.04 :)
OkieOth

1
Чорт, це геніальний хак! Apache намагається відкрити звичайний файл, але він перенаправляється через симпосилання до власного stdout з власної точки зору.
joonas.fi

1
Просто хочу сказати спасибі ... офіційний контейнер docker apache httpd 2.4 не в змозі записувати журнали після ввімкнення ssl. Додавання цих рядків + ssl_request_log до Dockerfile, який витягується з httpd2.4 працював.
j.con

3
Ви можете скоротити / proc / self / fd / 1 як / dev / stdout. Вони точно те саме.
Чак Адамс

@ChuckAdams - вони є м'якою ланкою і зазвичай там є, але жодних гарантій при створенні зображень на їх наявність. Особливо скоротити мікрообрази. Тоді як ядро ​​завжди буде експортувати / proc / self / fd / 1 & 2.
Метт

1

Спеціально відповідь не вимагається, але, можливо, кращим способом, залежно від сценарію, було б взагалі не входити до stdout / stderr. Просто перекладіть журнали до кота у форматі JSON. Це усуне необхідність диференціювати потоки, оскільки json може мати дані, необхідні для цього, щоб їх розрізнити. наприклад, щось наступне. Потім це можна набагато легше потрапляти в щось на зразок сірого журналу

GlobalLog "| cat - " gelf
ErrorLog "| cat - " 

LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\",  \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\",  \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf

ErrorLogFormat "{ \"app_name\": \"apache\",  \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"

Існує також модуль реєстрації гельфа, тож ви можете передавати пряму передачу з apache на сервер типу сірого журналу, якщо хочете

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.