web-dev-qa-db-fra.com

Écriture des journaux Apache2 sur stdout / stderr?

J'exécute Apache2 dans un conteneur Docker et je ne veux rien écrire sur le disque, en écrivant les journaux sur stdout et stderr. J'ai vu quelques façons différentes de le faire ( Supervisord et stdout/stderr , Journal d'accès Apache à stdout ) mais cela ressemble à des hacks. N'y a-t-il aucun moyen de le faire par défaut?

Pour être clair, je ne veux pas réduire le journal, car cela entraînera l'écriture de choses sur le disque dans le conteneur.

31
aronchick
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

travaille sur ubuntu et centos pour moi

31
Oskarowski

Que diriez-vous de placer cela dans votre Dockerfile après l'installation du package Apache2?

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

En supposant que c'est le chemin des journaux. C'est pour Ubuntu 14.04 et fonctionne également pour Ubuntu 16.04.

Remarque: si vous êtes certain que les liens symboliques /dev/stdout ou /proc/stderr sont là, vous pouvez également les utiliser. Je préfère le chemin vers le vrai fichier car il est garanti présent.

30
Matt

Pas spécifiquement une réponse demandée mais peut-être une meilleure façon, selon votre scénario, serait de ne pas vous connecter du tout à stdout/stderr. Il suffit de diriger les journaux vers cat au format JSON. Cela supprimerait la nécessité de différencier les flux car le json pourrait avoir les données nécessaires pour les distinguer. par exemple quelque chose dans le sens de ce qui suit. Cela peut ensuite être ingéré beaucoup plus facilement dans quelque chose comme 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 \" }"

Il existe également un module de journalisation gelf, vous pouvez donc diffuser directement d'Apache vers un serveur de type graylog si vous le souhaitez

1
krad