15.04 पर systemd इकाई का stdout लॉग नहीं करेगा


12

मैं वर्तमान में एक वेब सर्वर के रूप में एक सिस्टमड इकाई बनाने की कोशिश कर रहा हूँ। वर्तमान में, मेरी foo.serviceफ़ाइल इस प्रकार है:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

fooनिष्पादन स्वचालित रूप से stdout के लिए सभी HTTP अनुरोधों को लॉग - यह अच्छी तरह से परीक्षण किया जाता है। हालाँकि, जब मैं लॉग को देखता हूं, तो मुझे journalctl -u fooकेवल इस तरह से आउटपुट मिलता है:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

क्या कोई समझा सकता है कि यह सभी स्टडआउट आउटपुट को लॉग इन क्यों नहीं कर रहा है? मैं इस पिछले सवाल पर संक्षेप में देखा , लेकिन यह मदद नहीं करता है - हालांकि यह "की तर्ज पर कुछ के साथ alluded ... सिस्टम के लिए काम नहीं कर सकता है जो पूर्ण systemd का उपयोग नहीं करते हैं " - क्या यह Ubuntu 15.04 के लिए मामला होगा ? अग्रिम धन्यवाद, इस के साथ किसी भी मदद की बहुत सराहना की जाएगी!


1
सुनिश्चित करें, आपकी प्रक्रिया आउटपुट को बफ़र नहीं कर रही है। मुझे भी इसी तरह की समस्या हो रही थी और यह मेरी अजगर स्क्रिप्ट के आउटपुट बफ़रिंग को अक्षम करके हल हो गई। के रूप में उत्पादित लॉग रिकॉर्ड की संख्या अधिक नहीं थी, ऐसा लग रहा था कि कोई लॉगिंग नहीं है, लेकिन वास्तव में, यह अभी तक कोई मौका नहीं था, क्योंकि सभी अभी भी स्टडआउट आउटपुट बफर में इकट्ठा हो रहे थे।
Jan Vlcinsky 20

1
इसे भी ठीक करने की कोशिश की जा रही है। मुझे लगता है कि systemd बफरिंग करता है। स्टेकआउट UNIX में लाइन-बफ़र्ड है, लेकिन सिस्टमड अपनी बात करता है और बफ़र्स को बहुत अधिक (क्रम में तेज लेकिन बेकार हो सकता है)।
वेलकन

मुझे भी यही समस्या थी और पायथन के प्रिंट फंक्शन के साथ बफरिंग की समस्या थी! चूँकि मैं पायथन 3 का उपयोग कर रहा था, इसलिए मैंने कुछ ऐसा ही किया print('Hello World!', flush=True)और इसने चाल चली! जर्नाल में आउटपुट दिखाई देने लगा।
टाइमब्रम

जवाबों:


9

वास्तव में, UNIX में बफरिंग संदर्भ पर निर्भर करता है: जब स्टडआउट को कंसोल की तरह कुछ इंटरैक्टिव के लिए पुनर्निर्देशित किया जाता है - यह आमतौर पर लाइन-बफ़र्ड होता है, अन्यथा यह पूरी तरह से बफर हो जाता है।

Setvbuf लाइब्रेरी कॉल का उपयोग करके एप्लिकेशन के अंदर बफरिंग को बदला जा सकता है ।

लेकिन यह लॉन्च पर stdbuf कमांड के साथ भी किया जा सकता है :

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(लाइन-बफर केस के लिए)


इससे मेरा दिन बच गया! आपका बहुत बहुत धन्यवाद। लेकिन मैं थोड़ा उलझन में हूं कि ExecStart=/my/foo/programसेवा समाप्त होने पर स्टडआउट लॉग क्यों फ्लश नहीं किया जाता है, लेकिन इसके बजाय पूरी तरह से गायब हो जाता है।
wlnirvana

0

उबंटू 15.04 पर डिफ़ॉल्ट रूप से , सिस्टमड जर्नल्स केवल अस्थिर हैं और अंदर रखे गए हैं /run/systemd/journalऔर प्रत्येक रिबूट में खो गए हैं। लगातार systemd जर्नल का उपयोग करने के लिए , आपको /var/log/journalनिर्देशिका बनाने की आवश्यकता है (और systemd-journald.service को पुनरारंभ करें)।

तो, stdoutउत्पादन हो सकता है, उत्पादन को केवल पुनर्निर्देशित किया जाता है syslogऔर सिस्टम जर्नल में नहीं रखा जाता है । उसके लिए, आपको ऊपर बताए अनुसार एक निरंतर सिस्टम जर्नल का उपयोग करने की आवश्यकता हो सकती है।

क्या आपने /var/log/syslogअपने fooलॉग के लिए जाँच की है ?


मैंने /var/log/journalआपके द्वारा बताए अनुसार बनाया था , लेकिन मैं अपने सिस्टमड सेवा को वैसे भी नहीं देख रहा हूं। में, /var/log/syslogमैं न तो यह देखते हैं।
लॉगऑफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.