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.

quinn
sumber
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

Patrick
sumber
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

Boeboe
sumber
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.

Segera
sumber
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).

beranda
sumber
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
Oleg Neumyvakin
sumber
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;
intika
sumber