Schreiben von Apache2-Protokollen nach stdout / stderr?


29

Ich führe Apache2 in einem Docker-Container aus und möchte nichts auf die Festplatte schreiben, sondern Protokolle in stdout und stderr schreiben. Ich habe verschiedene Möglichkeiten gesehen, dies zu tun ( Supervisord und stdout / stderr , Apache-Zugriffsprotokoll auf stdout ), aber diese scheinen Hacks zu sein. Gibt es keine Möglichkeit, dies standardmäßig zu tun?

Um klar zu sein, möchte ich das Protokoll nicht mit einem Tail versehen, da dies dazu führt, dass Dinge auf den Datenträger im Container geschrieben werden.


Wollen Sie nicht, dass diese Protokolle für Fehlerbehebungs- / Debugging-Zwecke leicht zugänglich sind? Warum schreiben Sie sie nicht einfach auf einen (R) Syslog-Server?
HTTP500

@ HTTP500 - Sie werden außerhalb des Docker-Containers erfasst.
Matt

Wenn Sie Folgendes verwenden: FROM php: 5.6-apache, enthält dies bereits Protokolle für stdout und stderr.
Martlark

Antworten:



25

Wie wäre es, wenn Sie dies nach der Installation des Pakets apache2 in Ihr Dockerfile kopieren?

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

Angenommen, dies ist der Pfad der Protokolle. Es ist für Ubuntu 14.04 und funktioniert auch für Ubuntu 16.04.

Hinweis: Wenn Sie sicher sind, dass die symbolischen Links vorhanden sind /dev/stdoutoder /proc/stderrsind, können Sie auch diese verwenden. Ich bevorzuge den Pfad zur realen Datei, da diese garantiert vorhanden ist.


funktioniert auch hervorragend mit Ubuntu 16.04 :)
OkieOth

1
Verdammt, das ist ein genialer Hack! Apache versucht, eine reguläre Datei zu öffnen, wird jedoch über einen Symlink aus seiner eigenen Perspektive auf seine eigene Standardausgabe umgeleitet.
joonas.fi

1
Ich möchte mich nur bedanken ... der offizielle Docker-Container für Apache httpd 2.4 kann nach dem Aktivieren von ssl keine Protokolle schreiben. Das Hinzufügen dieser Zeilen + ssl_request_log zur Docker-Datei, die von httpd2.4 abgerufen wird, hat funktioniert.
j.con

3
Sie können / proc / self / fd / 1 als / dev / stdout abkürzen. Sie sind genau das gleiche.
Chuck Adams

@ChuckAdams - Sie sind ein Softlink und normalerweise dort, aber keine Garantie beim Erstellen von Bildern, dass sie vorhanden sind. Reduzieren Sie insbesondere Mikrobilder. Während der Kernel immer / proc / self / fd / 1 & 2 exportiert.
Matt

1

Es wird nicht speziell nach einer Antwort gefragt, aber je nach Szenario ist es möglicherweise besser, sich überhaupt nicht bei stdout / stderr anzumelden. Leiten Sie die Protokolle einfach im JSON-Format an cat weiter. Dies würde die Notwendigkeit beseitigen, die Streams zu unterscheiden, da der JSON die Daten enthalten könnte, die zur Unterscheidung benötigt werden. zB etwas in der folgenden Richtung. Dies kann dann viel einfacher in so etwas wie Graylog aufgenommen werden

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

Es gibt auch ein gelf-Protokollierungsmodul, sodass Sie auf Wunsch auch direkt von Apache auf einen Graylog-Server streamen können

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.