Apache2 Yazılması Günlüğü stdout / stderr?


29

Apache2'yi bir docker kapsayıcısında çalıştırıyorum ve diske hiçbir şey yazmak istemiyorum, günlükleri stdout ve stderr'e yazıyorum. Bunu yapmanın birkaç farklı yolunu gördüm ( Supervisord ve stdout / stderr , Apache erişim günlüğünü stdout'a ) ama bunlar korsanlara benziyor. Bunu varsayılan olarak yapmanın bir yolu yok mu?

Açık olmak gerekirse, kütüğü kuyruğa sokmak istemiyorum çünkü bu, konteynere diske bir şeyler yazılmasıyla sonuçlanacaktır.


Bu günlüklerin sorun giderme / hata ayıklama amacıyla kolayca erişilebilir olmasını istemeyeceksiniz mi? Neden sadece onları bir (r) syslog sunucusuna yazmıyorsunuz?
HTTP500,

@ HTTP500 - Liman işçisi konteynerinin dışından yakalanırlar.
Matt

Kullanırsanız: FROM php: 5.6-apache, bu zaten stdout ve stderr için günlükleri içerir.
Martlark

Yanıtlar:


30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

benim için ubuntu ve centos üzerinde çalışıyor


hangi dosyaya gitmelidir vb pls
Alexander Mills

Bu domain.confdosya içine gider veya .htaccessbir kullanmıyorsanız conf.
Tyler Christian,

25

Apache2 paketi kurulduktan sonra bunu Dockerfile içine yerleştirmeye ne dersiniz?

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

Bunun logların yolu olduğunu varsayalım. Ubuntu 14.04 içindir ve Ubuntu 16.04 için de çalışır.

Not: sembolik bağlantıların olduğundan /dev/stdoutveya /proc/stderrorada olduğundan eminseniz bunları da kullanabilirsiniz. Bu garantili olduğu için gerçek dosyanın yolunu tercih ederim.


:) Ubuntu 16.04 ile mükemmel da çalışır
OkieOth

1
Kahretsin, ustaca bir kesmek! Apache normal bir dosya açmaya çalışır, ancak symlink yoluyla kendi stdout'una kendi perspektifinden yönlendirilir.
joonas.fi

1
Sadece teşekkür etmek istiyorum ... resmi apache httpd 2.4 liman işçisi konteyneri, ssl etkinleştirildikten sonra günlük yazmıyor. Bu satırları + ssl_request_log eklemek, httpd2.4'ten gelen Dockerfile dosyasına çalıştı.
j.con

3
/ Proc / self / fd / 1 komutunu / dev / stdout olarak kısaltabilirsiniz. Onlar tamamen aynı şeyler.
Chuck Adams

@ChuckAdams - bunlar yumuşak bir bağlantıdır ve normal olarak oradadır, ancak mevcut oldukları görüntüleri oluştururken hiçbir garanti yoktur. Özellikle mikro görüntüleri kesin. Oysa çekirdek her zaman / proc / self / fd / 1 & 2 'yi verecektir.
Matt

1

Özel olarak sorulan bir cevap değil, belki de daha iyi bir yol, senaryonuza bağlı olarak, stdout / stderr'a giriş yapmamak olur. Sadece günlükleri bir JSON formatında kedilere yönlendirin. Bu, json'un onları ayırt etmek için gereken verilere sahip olması nedeniyle akışları farklılaştırma ihtiyacını ortadan kaldıracaktır. örneğin aşağıdakilerin çizgileri boyunca bir şeyler. Bu daha sonra graylog gibi bir şeye daha kolay bir şekilde alınabilir

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

Gelf günlüğü modülü de vardır, böylece doğrudan apache'den graylog tipi bir sunucuya aktarabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.