Zapisywanie dzienników Apache2 na stdout / stderr?


29

Korzystam z Apache2 w kontenerze dokowanym i chcę nic nie zapisywać na dysku, zapisując logi na stdout i stderr. Widziałem kilka różnych sposobów, aby to zrobić ( Supervisord i stdout / stderr , dziennik dostępu Apache do stdout ), ale wyglądają jak włamania. Czy nie ma domyślnego sposobu, aby to zrobić?

Dla jasności nie chcę modyfikować dziennika, ponieważ spowoduje to zapisanie rzeczy na dysku w kontenerze.


Czy nie chcesz, aby te dzienniki były łatwo dostępne do celów rozwiązywania problemów / debugowania? Dlaczego zamiast tego nie napisać ich na (s) serwerze syslog?
HTTP500

@ HTTP500 - Zostają przechwycone na zewnątrz kontenera dokowanego.
Matt

Jeśli użyjesz: FROM php: 5.6-apache, który już zawiera logi do stdout i stderr.
Martlark,

Odpowiedzi:



25

Co powiesz na umieszczenie tego w pliku Docker po zainstalowaniu pakietu apache2?

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

Zakładając, że jest to ścieżka dzienników. Dotyczy Ubuntu 14.04 i działa również z Ubuntu 16.04.

Uwaga: jeśli jesteś pewien, że dowiązania symboliczne /dev/stdoutlub /proc/stderristnieją, to mogą również korzystać z nich. Wolę ścieżkę do prawdziwego pliku, ponieważ jest to gwarantowane, że jest obecne.


działa świetnie również z Ubuntu 16.04 :)
OkieOth,

1
Cholera, to genialny hack! Apache próbuje otworzyć zwykły plik, ale zostaje przekierowany przez dowiązanie symboliczne do swojego standardowego pliku z własnej perspektywy.
joonas.fi

1
Chcę tylko podziękować ... oficjalny kontener dokujący httpd 2.4 apache nie zapisuje logów po włączeniu ssl. Dodanie tych wierszy + ssl_request_log do pliku Docker, który ściąga z httpd2.4 działało.
j.con

3
Możesz skrócić / proc / self / fd / 1 jako / dev / stdout. Są dokładnie tym samym.
Chuck Adams

@ChuckAdams - są miękkim linkiem i zwykle tam są, ale nie ma gwarancji przy budowaniu obrazów, że są obecne. Zwłaszcza wycinane mikro obrazy. Podczas gdy jądro zawsze eksportuje / proc / self / fd / 1 i 2.
Matt

1

Nie jest to konkretnie odpowiedź na pytanie, ale być może lepszym sposobem, w zależności od twojego scenariusza, byłoby w ogóle nie logowanie się do stdout / stderr. Wystarczy potokować dzienniki do cat w formacie JSON. To wyeliminowałoby potrzebę różnicowania strumieni, ponieważ json mógłby mieć w sobie dane potrzebne do ich rozróżnienia. np. coś podobnego do następującego. Można to następnie łatwiej przyswoić do czegoś takiego jak 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 \" }"

Istnieje również moduł rejestrowania Gelf, więc możesz przesyłać strumieniowo bezpośrednio z Apache na serwer typu Graylog, jeśli chcesz

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.