Écriture des journaux Apache2 sur stdout / stderr?

29

J'exécute Apache2 dans un conteneur Docker et je ne veux rien écrire sur le disque, en écrivant des 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.

aronchick
la source
N'allez-vous pas vouloir que ces journaux soient facilement accessibles à des fins de dépannage / débogage? Pourquoi ne pas simplement les écrire sur un serveur (r) syslog à la place?
HTTP500
@ HTTP500 - Ils sont capturés à l'extérieur du conteneur Docker.
Matt
Si vous utilisez: FROM php: 5.6-apache, cela inclut déjà les journaux de stdout et stderr.
Martlark

Réponses:

30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

travaille sur ubuntu et centos fo me

Oskarowski
la source
quel fichier doit-il entrer dans etc pls
Alexander Mills
Cela va dans votre domain.conffichier ou .htaccesssi vous n'utilisez pas de fichier conf.
Tyler Christian
25

Que diriez-vous de placer cela dans votre Dockerfile après l'installation du paquet 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/stdoutou /proc/stderrsont là, vous pouvez également les utiliser. Je préfère le chemin vers le vrai fichier car il est garanti présent.

Mat
la source
fonctionne très bien aussi avec Ubuntu 16.04 :)
OkieOth
1
Merde, c'est un hack ingénieux! Apache essaie d'ouvrir un fichier normal, mais est redirigé via un lien symbolique vers sa propre sortie standard de son propre point de vue.
joonas.fi
1
Je veux juste dire merci ... le conteneur Docker officiel Apache httpd 2.4 ne parvient pas à écrire les journaux après avoir activé SSL. L'ajout de ces lignes + ssl_request_log au Dockerfile qui tire de httpd2.4 a fonctionné.
j.con
3
Vous pouvez abréger / proc / self / fd / 1 en / dev / stdout. C'est exactement la même chose.
Chuck Adams
@ChuckAdams - ils sont un lien logiciel et normalement là, mais aucune garantie lors de la création d'images qu'ils sont présents. Découpez particulièrement les micro-images. Alors que le noyau exportera toujours / proc / self / fd / 1 & 2.
Matt
1

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 à stdout / stderr du tout. 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 depuis apache vers un serveur de type graylog si vous le souhaitez

krad
la source