Menulis Log Apache2 ke stdout / stderr?

29

Saya menjalankan Apache2 dalam wadah buruh pelabuhan, dan ingin menulis apa pun ke disk, menulis log ke stdout dan stderr. Saya telah melihat beberapa cara berbeda untuk melakukan ini ( Supervisord dan stdout / stderr , akses log Apache ke stdout ) tetapi ini tampak seperti hack. Apakah tidak ada cara untuk melakukan ini secara default?

Untuk lebih jelasnya, saya tidak ingin membuntuti log, karena itu akan menghasilkan hal-hal yang ditulis ke disk dalam wadah.

aronchick
sumber
Tidakkah Anda ingin agar log-log itu mudah diakses untuk tujuan pemecahan masalah / debugging? Mengapa tidak menuliskannya saja ke server syslog (r) saja?
HTTP500
@ HTTP500 - Mereka ditangkap di luar wadah buruh pelabuhan.
Matt
Jika Anda menggunakan: FROM php: 5.6-apache, itu sudah termasuk log ke stdout dan stderr.
Martlark

Jawaban:

30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

bekerja di ubuntu dan cento untuk saya

Oskarowski
sumber
file mana yang harusnya masuk ke etc pls
Alexander Mills
Ini masuk dalam domain.conffile Anda atau .htaccessjika Anda tidak menggunakan conf.
Tyler Christian
25

Bagaimana dengan menempatkan ini di Dockerfile Anda setelah paket apache2 diinstal?

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

Dengan asumsi bahwa ini adalah jalur log. Ini untuk Ubuntu 14.04 dan juga berfungsi untuk Ubuntu 16.04.

Catatan: jika Anda yakin bahwa tautan simbolik /dev/stdoutatau /proc/stderrada di sana, maka Anda juga dapat menggunakannya. Saya lebih suka jalur ke file nyata karena ini dijamin hadir.

Mat
sumber
berfungsi dengan baik juga dengan Ubuntu 16.04 :)
OkieOth
1
Sial, itu jalan pintas! Apache mencoba membuka file biasa, tetapi dialihkan melalui symlink ke stdout sendiri dari perspektifnya sendiri.
joonas.fi
1
Hanya ingin mengucapkan terima kasih ... wadah docker apache resmi httpd 2.4 gagal menulis log setelah mengaktifkan ssl. Menambahkan baris ini + ssl_request_log ke Dockerfile yang menarik dari httpd2.4 bekerja.
j.con
3
Anda dapat menyingkat / proc / self / fd / 1 sebagai / dev / stdout. Mereka hal yang persis sama.
Chuck Adams
@ChuckAdams - mereka adalah tautan lunak dan biasanya ada di sana, tetapi tidak ada jaminan saat membuat gambar yang ada. Terutama memotong gambar mikro. Sedangkan kernel akan selalu mengekspor / proc / self / fd / 1 & 2.
Matt
1

Tidak secara khusus jawaban yang diminta tetapi mungkin cara yang lebih baik, tergantung pada skenario Anda, adalah untuk tidak masuk ke stdout / stderr sama sekali. Hanya pipa log ke kucing dalam format JSON. Ini akan menghilangkan kebutuhan untuk membedakan stream karena json dapat memiliki data yang diperlukan untuk membedakannya. misalnya sesuatu di sepanjang garis berikut ini. Ini kemudian dapat dicerna dengan lebih mudah menjadi sesuatu seperti 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 \" }"

Ada juga modul logging gelf, sehingga Anda dapat melakukan streaming langsung dari apache ke server jenis graylog juga jika Anda mau

krad
sumber