Назад | Перейти на главную страницу

Запись журналов Apache2 в stdout / stderr?

Я запускаю Apache2 в контейнере докеров и не хочу ничего писать на диск, а журналы записываются в stdout и stderr. Я видел несколько разных способов сделать это (Супервизор и stdout / stderr, Журнал доступа Apache к stdout), но это похоже на взлом. Нет возможности сделать это по умолчанию?

Чтобы было ясно, я не хочу следить за журналом, поскольку это приведет к тому, что все будет записано на диск в контейнере.

  ErrorLog /dev/stderr
  TransferLog /dev/stdout

работает на ubuntu и centos для меня

Как насчет того, чтобы поместить это в свой 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 есть, то вы также можете использовать их. Я предпочитаю путь к реальному файлу, так как он гарантированно присутствует.

Не совсем запрашиваемый ответ, но, возможно, лучший способ, в зависимости от вашего сценария, - это вообще не входить в stdout / stderr. Просто отправьте журналы в cat в формате 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 \" }"

Существует также модуль ведения журнала gelf, так что вы можете транслировать прямо с apache на сервер типа Graylog, если хотите.