Ana işlemin STDOUT ve STDERR'ına nginx access_log ve error_log günlüğü ekleyin


137

Ana işlem günlüğünü bir dosya yerine STDOUT STDERR'a kaydetmenin bir yolu var mı?

Sadece access_log yönergesine bir dosya yolu geçirebileceğiniz görülüyor:

access_log  /var/log/nginx/access.log

Aynı şey error_log için de geçerli:

error_log /var/log/nginx/error.log

Bunun nginx'in bir özelliği olmayabileceğini anlıyorum, örneğin tail kullanan kısa bir çözümle ilgileniyorum. Ana süreçten gelmesi tercih edilir, çünkü nginx'i ön planda çalıştırıyorum.


14
Docker konteyner içinde Nginx mi kullanıyorsunuz? Ödemeye bu cevabı .
czerasz

Kabul edilen cevap (Patrick's) resmi Nginx Docker görüntüleri (hub.docker.com/_/nginx) için işe yarar.
Farshid T

Yanıtlar:


199

Düzenleme: Görünüşe göre nginx error_log stderr;, Anon'un cevabında belirtildiği gibi artık destekliyor .

Günlükleri adresine gönderebilirsiniz /dev/stdout. İçinde nginx.conf:

daemon off;
error_log /dev/stdout info;

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

düzenleme: Belirli docker konteynerlerini çalıştırıyorsanız, ln -sf / proc / self / fd / dev / çalıştırmanız gerekebilir , sonra /dev/fd/1veya/dev/fd/2


2
Bunu yapmaya çalıştığımda şu hatayı alıyorum: 2014/07/29 10:19:09 [acil] 13742 # 0: open () "/ dev / stdout" başarısız (13: İzin reddedildi)
Jon Tirsen

1
Jon, hangi sistemdesin? Benim sistemimde / dev / stdout, / dev / fd / 1'e ait ve kullanıcım tarafından okunabilir + yazılabilir, herkes tarafından okunabilir bir sembolik bağlantıdır.
Patrick

1
ENXIOStandart çıkış bir dosya yerine bir sokete açıldığında bunun başarısız olduğunu görüyorum . Bunun kasıtlı ve kasıtlı olduğunu belirten bir yukarı akış çekirdek bileti var: bugzilla.kernel.org/show_bug.cgi?id=1360 - bu nedenle, bu yanıt bazı durumlarda yeterli olsa da, olası aralığı tam olarak kapsamaz başarısızlıkların.
Charles Duffy

1
Başarılı olamadan bunda birkaç saat kaybettim. Her şeyi değiştirmeye çalıştı (arka plan programı modları, kullanıcılar, nginx sürümleri vb.). Benim için çalışmıyor. "" "open ()" / dev / stderr "başarısız oldu (6: Böyle bir aygıt veya adres yok)" "" (stdout ile aynı sorunlar, ancak nginx, stderrbelgelere göre çıktı vermelidir )
Ivan Kleshnin

1
Bir docker içinde, işleminiz kapsayıcıda kök olarak çalışmıyorsa, reddedilen izin alabilirsiniz. Bir sonraki sürümde bunun için bir düzeltme geliyor.
Dobes Vandermeer

54

Soru docker ile ilgiliyse ... resmi nginx docker görüntüleri bunu stdout / stderr'e softlinkler yaparak yapar.

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
Bu cevap çoğunlukla doğrudur, ancak ne yazık ki dağ görüntüleri için değil (bkz. Github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), yalnızca jessie gibi diğerleri için bu ifadeyi kullanır. Alplerde bir kullanıcıysanız, ile kendi Dockerfile'ınızı oluşturun 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
Patrick'in cevabı , hem debian (en son) hem de alp bazları olmak üzere resmi nginx görüntüleri ( hub.docker.com/_/nginx ) için çalışıyor .
Farshid T

REF bağlantınız kesik görünüyor.
2018 saat

@jonashackt Alp resimleri kullandım ve aynı zamanda stdout'a giriş yaptığını
gördüm

Yukarıda belirtilen satırla (100. satırdan önce bir yerde) docker dosyasını görmek için bir sürüme ( hub.docker.com/_/nginx ) tıklayın .
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

Kullanmayın: /dev/stderr systemd-nspawn'ı kullanacaksanız bu, kurulumunuzu bozacaktır.


5

Nginx'i bir Docker konteynerinde çalıştırırken, log dizini üzerine monte edilmiş bir birimin, @Boeboe'nun cevabında açıklandığı gibi Dockerfile'nizde günlük dosyaları ile stdout / stderr arasında bir softlink oluşturma amacını bozduğunu unutmayın .

Bu durumda, giriş noktanızda yazılım bağlantısı oluşturabilir (birimler monte edildikten sonra yürütülür) veya hiç bir birim kullanmayabilirsiniz (örneğin, günlükler bir merkezi günlük kaydı sistemi tarafından zaten toplandığında).


3

PHP-FPM'nin docker görüntüsünde, böyle bir yaklaşım görüyorum:

# 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

Hata ayıklama amacıyla:

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

Klasik bir amaç için

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

gerektir

Yapılandırma dosyasındaki sunucu ayracı altında

access_log /dev/stdout;
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.