Gravando logs do Apache2 no stdout / stderr?

29

Estou executando o Apache2 em um contêiner de docker e quero gravar nada no disco, gravando logs em stdout e stderr. Eu já vi algumas maneiras diferentes de fazer isso ( Supervisord e stdout / stderr , log de acesso do Apache ao stdout ), mas elas parecem hacks. Não há como fazer isso por padrão?

Para deixar claro, não quero ajustar o log, pois isso resultará na gravação de coisas no disco no contêiner.

aronchick
fonte
Você não deseja que esses logs sejam facilmente acessíveis para fins de solução de problemas / depuração? Por que não apenas gravá-los em um servidor (r) syslog?
HTTP500
@ HTTP500 - Eles são capturados na parte externa do contêiner do docker.
Matt
Se você usar: FROM php: 5.6-apache, isso já inclui logs para stdout e stderr.
Martlark

Respostas:

30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

funciona no ubuntu e centos para mim

Oskarowski
fonte
qual arquivo ele deve entrar etc etc
Alexander Mills
Isso entra no seu domain.confarquivo ou .htaccessse você não estiver usando um conf.
Tyler Christian
25

Que tal colocar isso no Dockerfile após a instalação do pacote apache2?

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

Supondo que esse seja o caminho dos logs. É para o Ubuntu 14.04 e também funciona para o Ubuntu 16.04.

Nota: se tiver certeza de que os links simbólicos /dev/stdoutou /proc/stderrestão lá, então você também pode usá-los. Eu prefiro o caminho para o arquivo real, pois isso é garantido no presente.

Matt
fonte
funciona muito bem também com o Ubuntu 16.04 :)
OkieOth, 23/09/16
11
Porra, isso é um truque engenhoso! O Apache tenta abrir um arquivo regular, mas é redirecionado via link simbólico para seu próprio stdout a partir de sua própria perspectiva.
Joon.fi # 3/16
11
Just want to say thanks... the official apache httpd 2.4 docker container fails to write logs after enabling ssl. Adding these lines + ssl_request_log to the Dockerfile that pulls from httpd2.4 worked.
j.con
3
Você pode abreviar / proc / self / fd / 1 como / dev / stdout. Eles são exatamente a mesma coisa.
Chuck Adams
@ChuckAdams - eles são um link simples e normalmente existem, mas não há garantias ao criar imagens de que estão presentes. Reduza especialmente as micro imagens. Considerando que o kernel sempre exportará / proc / self / fd / 1 e 2. #
828 Matt Matt
1

Não é especificamente uma resposta solicitada, mas talvez uma maneira melhor, dependendo do seu cenário, seja não logar no stdout / stderr. Basta canalizar os logs para o gato em um formato JSON. Isso eliminaria a necessidade de diferenciar os fluxos, pois o json poderia ter os dados necessários para distingui-los. por exemplo, algo como o seguinte. Isso pode ser ingerido com muito mais facilidade em algo como graylog

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 \" }"

Há também um módulo de registro de gelf, para que você possa transmitir diretamente do apache para um servidor do tipo graylog, se desejar

krad
fonte