Scrivere i log di Apache2 su stdout / stderr?


29

Sto eseguendo Apache2 in un contenitore docker e non voglio scrivere nulla sul disco, scrivendo i log su stdout e stderr. Ho visto diversi modi per farlo ( Supervisord e stdout / stderr , Apache accedi al registro stdout ) ma questi sembrano degli hack. Non c'è modo di farlo per impostazione predefinita?

Per essere chiari, non voglio mettere in coda il registro, poiché ciò comporterà la scrittura delle cose sul disco nel contenitore.


Non vuoi che quei registri siano facilmente accessibili per scopi di risoluzione dei problemi / debug? Perché non semplicemente scriverli su un server (r) syslog invece?
HTTP500,

@ HTTP500: vengono catturati all'esterno del contenitore della finestra mobile.
Matt,

Se si utilizza: FROM php: 5.6-apache, che include già i registri di stdout e stderr.
Martlark,

Risposte:



25

Che ne dici di metterlo nel tuo Dockerfile dopo aver installato il pacchetto apache2?

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

Supponendo che questo sia il percorso dei registri. È per Ubuntu 14.04 e funziona anche per Ubuntu 16.04.

Nota: se sei sicuro che i collegamenti simbolici /dev/stdouto /proc/stderrci sono, puoi anche usarli. Preferisco il percorso del file reale in quanto questo è garantito presente.


funziona benissimo anche con Ubuntu 16.04 :)
OkieOth

1
Accidenti, è un trucco geniale! Apache tenta di aprire un file normale, ma viene reindirizzato tramite symlink al proprio stdout dalla sua prospettiva.
joonas.fi,

1
Voglio solo dire grazie ... il contenitore docker apd httpd 2.4 ufficiale non riesce a scrivere i log dopo aver abilitato ssl. Aggiungendo queste righe + ssl_request_log al Dockerfile che estrae da httpd2.4 ha funzionato.
j.con,

3
È possibile abbreviare / proc / self / fd / 1 come / dev / stdout. Sono esattamente la stessa cosa.
Chuck Adams,

@ChuckAdams - sono un collegamento soft e normalmente lì, ma non ci sono garanzie quando si creano immagini che sono presenti. Ridurre in particolare le micro immagini. Considerando che il kernel esporterà sempre / proc / self / fd / 1 & 2.
Matt

1

Non specificamente una risposta richiesta, ma forse un modo migliore, a seconda del tuo scenario, sarebbe quello di non accedere affatto a stdout / stderr. Basta reindirizzare i registri a cat in un formato JSON. Ciò eliminerebbe la necessità di differenziare i flussi in quanto il json potrebbe disporre dei dati necessari per distinguerli. ad esempio qualcosa sulla falsariga di quanto segue. Questo può quindi essere ingerito molto più facilmente in qualcosa come 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 \" }"

C'è anche un modulo di registrazione gelf, quindi puoi eseguire lo streaming diretto da apache a un server di tipo graylog se lo desideri

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.