Memiliki nginx access_log dan log error_log ke STDOUT dan STDERR dari proses master


136

Apakah ada cara untuk memiliki proses master log ke STDOUT STDERR daripada ke file?

Tampaknya Anda hanya bisa meneruskan file ke arahan access_log:

access_log  /var/log/nginx/access.log

Dan hal yang sama berlaku untuk error_log:

error_log /var/log/nginx/error.log

Saya mengerti bahwa ini mungkin bukan fitur nginx, saya akan tertarik pada solusi ringkas yang menggunakan ekor, misalnya. Lebih disukai meskipun itu berasal dari proses master karena saya menjalankan nginx di latar depan.


14
Menggunakan Nginx di dalam wadah Docker? Lihat jawaban ini .
czerasz

Jawaban yang diterima (Patrick) berfungsi untuk gambar resmi Nginx Docker (hub.docker.com/_/nginx).
Farshid T

Jawaban:


197

Sunting: tampaknya nginx sekarang mendukung error_log stderr;seperti yang disebutkan dalam jawaban Anon .

Anda dapat mengirim log ke /dev/stdout. Di nginx.conf:

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}

sunting: Mungkin perlu menjalankan ln -sf / proc / self / fd / dev / jika menggunakan kontainer docker tertentu, kemudian gunakan /dev/fd/1atau/dev/fd/2


2
Ketika saya mencoba melakukan ini, saya mendapatkan kesalahan berikut: 2014/07/29 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" gagal (13: Izin ditolak)
Jon Tirsen

1
Jon, sistem apa yang kamu pakai? Di sistem saya, / dev / stdout adalah symlink yang dapat dibaca dunia untuk / dev / fd / 1 yang dimiliki dan dibaca + dapat ditulis oleh pengguna saya.
Patrick

1
Saya melihat ini gagal dengan ENXIOketika stdout terbuka ke soket daripada file. Ada tiket kernel upstream yang menunjukkan bahwa ini disengaja dan dengan niat: bugzilla.kernel.org/show_bug.cgi?id=1360 - jadi, sementara jawaban ini cukup dalam beberapa kasus, itu tidak sepenuhnya mencakup berbagai kemungkinan kegagalan.
Charles Duffy

1
Kehilangan beberapa jam karena ini tidak berhasil. Mencoba mengubah segalanya (mode daemon, pengguna, versi nginx dll). Itu tidak bekerja untuk saya. "" "open ()" / dev / stderr "gagal (6: Tidak ada perangkat atau alamat seperti itu)" "" (masalah yang sama dengan stdout, tetapi nginx akan ditampilkan stderrsesuai dengan dokumen)
Ivan Kleshnin

1
Di dalam buruh pelabuhan Anda mungkin mendapat izin ditolak jika proses Anda tidak berjalan sebagai root di wadah. Ada perbaikan untuk ini di versi berikutnya.
Dobes Vandermeer

54

Jika pertanyaannya terkait dengan buruh pelabuhan ... gambar nginx docker resmi melakukan ini dengan membuat softlink menuju stdout / stderr

RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

REF: https://microbadger.com/images/nginx


5
Jawaban ini sebagian besar benar, tetapi sayangnya tidak untuk gambar alpine (lihat github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), hanya untuk yang lain seperti jessie yang menggunakan pernyataan ini. Jika Anda pengguna alpine, cukup buat Dockerfile Anda sendiri dengan FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt

1
Jawaban Patrick berfungsi untuk gambar nginx resmi ( hub.docker.com/_/nginx ), keduanya berbasis debian (terbaru) dan alpine.
Farshid T

Tautan REF Anda tampaknya sudah mati.
peedee

@jonashackt Saya menggunakan gambar alpine dan saya menemukannya juga masuk ke stdout
Qiulang

Klik pada versi ( hub.docker.com/_/nginx ) untuk melihat file buruh pelabuhan dengan baris yang disebutkan di atas (di suatu tempat sebelum baris 100).
qräbnö

24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/en/docs/ngx_core_module.html#error_log

Jangan gunakan: /dev/stderr Ini akan merusak pengaturan Anda jika Anda akan menggunakan systemd-nspawn.


5

Saat menjalankan Nginx dalam wadah Docker, ketahuilah bahwa volume yang dipasang di atas dir log mengalahkan tujuan membuat softlink antara file log dan stdout / stderr di Dockerfile Anda, seperti dijelaskan dalam jawaban @Boeboe .

Dalam hal ini Anda dapat membuat softlink di titik masuk Anda (dijalankan setelah volume di-mount) atau tidak menggunakan volume sama sekali (misalnya ketika log sudah dikumpulkan oleh sistem logging pusat).


3

Pada gambar buruh pelabuhan dari PHP-FPM, saya telah melihat pendekatan seperti itu:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

1

Untuk tujuan debug:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

Untuk tujuan klasik

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

Memerlukan

Di bawah braket server pada file konfigurasi

access_log /dev/stdout;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.