मास्टर प्रक्रिया के STDOUT और STDERR में nginx access_log और error_log लॉग करें


137

क्या फाइल के बजाय STDOUT STDERR में मास्टर प्रोसेस लॉग करने का कोई तरीका है?

ऐसा लगता है कि आप केवल access_log निर्देश के लिए एक फ़ाइलपथ पारित कर सकते हैं:

access_log  /var/log/nginx/access.log

और वही error_log के लिए जाता है:

error_log /var/log/nginx/error.log

मैं समझता हूं कि यह केवल नगीने की विशेषता नहीं हो सकती है, मैं उदाहरण के लिए पूंछ का उपयोग करने वाले संक्षिप्त समाधान में रुचि रखता हूं। हालांकि यह बेहतर है कि यह मास्टर प्रक्रिया से आता है, क्योंकि मैं अग्रभूमि में नग्नेक्स चला रहा हूं।


14
डोजर कंटेनर के अंदर Nginx का उपयोग करना? इस उत्तर की जाँच करें
czerasz

आधिकारिक Nginx Docker छवियों (hub.docker.com/_/nginx) के लिए स्वीकृत उत्तर (पैट्रिक) काम करता है।
फर्षिद टी

जवाबों:


198

संपादित करें: ऐसा लगता है कि एनगेंक्स अब एनॉन के उत्तरerror_log stderr; में उल्लिखित समर्थन करता है ।

आप लॉग भेज सकते हैं /dev/stdout। इन nginx.conf:

daemon off;
error_log /dev/stdout info;

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

संपादित करें: ln -sf / proc / self / fd / dev चलाने की आवश्यकता हो सकती है / यदि कुछ डॉकटर कंटेनरों का उपयोग कर रहे हैं, तो उपयोग करें /dev/fd/1या/dev/fd/2


2
जब मैं ऐसा करने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है: 2014/07/29 10:19:09 [एमरजेड] 13742 # 0: ओपन () "/ देव / stdout" विफल (13: अनुमति से इनकार)
जॉन टीरसेन

1
जॉन, आप किस सिस्टम पर हैं? मेरे सिस्टम पर, / dev / stdout, / dev / fd / 1 के लिए विश्व-पठनीय सिमिलिंक है जो मेरे उपयोगकर्ता द्वारा स्वामित्व और पढ़ने योग्य है।
पैट्रिक

1
ENXIOजब स्टडआउट एक फ़ाइल के बजाय सॉकेट के लिए खुला होता है, तो मैं इसे विफल देख रहा हूं । एक अपस्ट्रीम कर्नेल टिकट है जो यह दर्शाता है कि यह जानबूझकर और इरादे से है: Bugzilla.kernel.org/show_bug.cgi?id=1360 - इस प्रकार, जबकि यह उत्तर कुछ मामलों में पर्याप्त है, यह पूरी तरह से संभव की सीमा को कवर नहीं करता है। विफलताओं।
चार्ल्स डफी

1
बिना किसी सफलता के इस पर कुछ घंटे खो दिए। सब कुछ बदलने की कोशिश की (डेमॉन मोड्स, यूजर्स, नगनेक्स वर्जन आदि)। यह सिर्फ मेरे लिए काम नहीं करता है। "" "खुला ()" / देव / stderr "विफल (6: ऐसा कोई उपकरण या पता नहीं)" "" ( stderr
स्टडआउट के

1
यदि आपकी प्रक्रिया कंटेनर में रूट के रूप में नहीं चलती है, तो एक docker के अंदर आपको अनुमति से वंचित किया जा सकता है। अगले संस्करण में इसके लिए एक फिक्स आ रहा है।
डोबेस वांडरमेर

54

यदि प्रश्न डॉकटर से संबंधित है ... आधिकारिक नगनेक्स डॉकटर छवियां स्टडआउट / स्टडर के प्रति सॉफ्टलिंक बनाकर ऐसा करती हैं

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
इस उत्तर ज्यादातर सही है, लेकिन के लिए उदासी नहीं है अल्पाइन छवियों (देखें github.com/nginxinc/docker-nginx/blob/master/stable/alpine/... ), दूसरों की तरह ही जेसी इस बयान का उपयोग करते हैं। यदि आप एक अल्पाइन उपयोगकर्ता हैं, तो बस अपना खुद का डॉकरीफाइल बनाएं 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
पैट्रिक का जवाब आधिकारिक nginx छवियों ( hub.docker.com/_/nginx ), दोनों डेबियन (नवीनतम) और अल्पाइन अड्डों के लिए काम करता है।
फर्षिद टी

आपका REF लिंक मृत प्रतीत होता है।
पेड़ी

@jonashackt मैंने अल्पाइन छवियों का उपयोग किया और मैंने पाया कि यह
स्टडआउट में

उपरोक्त संस्करण के साथ डॉक फ़ाइल को देखने के लिए एक संस्करण ( hub.docker.com/_/nginx ) पर क्लिक करें (कहीं लाइन 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

उपयोग न करें: /dev/stderr यदि आप systemd-nspawn का उपयोग करने जा रहे हैं तो यह आपके सेटअप को तोड़ देगा।


5

डॉकटर कंटेनर में नेग्नेक्स चलाते समय, ध्यान रखें कि लॉग डायर पर आरूढ़ एक वॉल्यूम लॉग फाइलों के बीच सॉफ्टलिंक बनाने के उद्देश्य को हरा देता है और आपके डॉकरीफाइल में stdout / stderr, जैसा कि @Boeboe के उत्तर में वर्णित है।

उस स्थिति में आप या तो अपने एंट्रीपॉइंट में सॉफ्टलिंक बना सकते हैं (वॉल्यूम बढ़ने के बाद निष्पादित) या बिल्कुल भी वॉल्यूम का उपयोग न करें (जैसे कि जब लॉग पहले से ही केंद्रीय लॉगिंग सिस्टम द्वारा एकत्र किए जाते हैं)।


3

PHP-FPM की डॉक इमेज में, मुझे ऐसा दृष्टिकोण दिखाई देता है:

# 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

डीबग उद्देश्य के लिए:

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

एक क्लासिक उद्देश्य के लिए

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

आवश्यकता होती है

कॉन्फ़िगरेशन फ़ाइल पर सर्वर ब्रैकेट के तहत

access_log /dev/stdout;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.