उपयोगकर्ता लॉग को अपने लॉग को सहेजने के लिए कहाँ पर प्रोग्राम किए जाते हैं?


23

मैं एक स्क्रिप्ट लिख रहा हूं जिसे मैं विशेषाधिकारों के बिना चलाना चाहता हूं। मैं उन त्रुटियों को चाहता हूं जो स्क्रिप्ट कुछ लॉग फ़ाइल में लॉग इन करने के लिए सामना करती हैं। मेरे पास एक लिखने के लिए विशेषाधिकार नहीं हैं /var/log। और मैं अपने घर निर्देशिका में एक नहीं करना चाहता।

क्या कोई स्थान है जहाँ उपयोगकर्ता स्क्रिप्ट रनटाइम जानकारी लॉग कर सकते हैं? /var/logबिना किसी संभावित सुरक्षा समस्या के मेरी स्क्रिप्ट लॉग जानकारी रखने के लिए सबसे अच्छा अभ्यास क्या है ? मुझे स्क्रिप्ट पर uid / gid सेट करने में संकोच हो रहा है।

जवाबों:


8

आप एक सामान्य उपयोगकर्ता के रूप में / var / log नहीं लिख सकते हैं, लेकिन यदि आप पूछते हैं तो syslog डेमॉन आपके लिए ऐसा करेगा। यदि आप मानक सिस्टम लॉग (उदाहरण /var/log/syslog) के लिए संदेश लॉग करना चाहते हैं , तो 4.4BSD उपयोगिता loggerआपके सिस्टम पर उपलब्ध हो सकती है। यह डेबियन पर डिफ़ॉल्ट रूप से स्थापित है, और bsdutilsडेबियन डेरिवेटिव पर पैकेज में है ।

सिस्टम लॉग पढ़ने के लिए विशेषाधिकारों की आवश्यकता के नुकसान के साथ , और अन्य कार्यक्रमों के संदेशों के साथ आपकी स्क्रिप्ट के संदेशों को मिला देने से आपको किसी पूर्व-मौजूदा लॉग रोटेशन, रखरखाव और निगरानी उपकरणों का लाभ मिलेगा ।

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

कई विन्यास विकल्प उपलब्ध हैं; आप में और अधिक पढ़ सकते हैं man logger


क्या इस उपयोगिता के लिए भाषा बंधन हैं? बल्कि स्टडआउट इन-ऐप की प्रत्येक पंक्ति के लिए उप-प्रक्रियाओं को स्पॉन नहीं करेगा।
थोरसुमोनर

@ थोरसुमोनर: जैसा कि गिल्स का जवाब कहता है, syslogएक सी लाइब्रेरी रूटीन है, और सी ++ किसी भी सी का उपयोग करके कॉल कर सकता है extern "C"। अन्य भाषाएँ अक्सर या तो कुछ भी C के लिए सामान्य बाइंडिंग प्रदान करती हैं, या विशिष्ट चीज़ों के लिए बाइंडिंग, लेकिन यह भाषा पर निर्भर करता है।
dave_thompson_085

12

यदि आप एक साधारण उपयोगकर्ता के रूप में एक कार्यक्रम चलाने का निर्णय लेते हैं, तो इसके लॉग के लिए प्राकृतिक स्थान आपके होम डायरेक्टरी में है। आपकी होम निर्देशिका आपके सभी फ़ाइलों को संग्रहीत करने के लिए है, चाहे वे आपके द्वारा चलाए जा रहे प्रोग्राम के लॉग हों या कुछ और।

यदि प्रोग्राम को सिस्टम के हिस्से के रूप में निष्पादित किया जाता है, तो आमतौर पर समर्पित सिस्टम उपयोगकर्ता के रूप में चल रहा है, तो इसके लॉग के लिए प्राकृतिक स्थान है /var/log। एक उपनिर्देशिका बनाएं /var/log/myappऔर इसे उचित अनुमति दें ताकि आपका आवेदन वहां लिख सके।

यदि प्रासंगिक और आपका ऑपरेटिंग सिस्टम इसे अनुमति देता है, तो लॉग फ़ाइल को केवल परिशिष्ट के रूप में चिह्नित करें। केवल जड़ ही ऐसा कर सकता है। इससे यह फायदा होता है कि यदि आपके आवेदन में समझौता किया जाता है, तो यह पिछले लॉग को मिटा नहीं पाएगा, जो कि समझौते के फॉरेंसिक विश्लेषण के लिए बहुत उपयोगी हो सकता है। लॉग को घुमाने के लिए आपको रूट के हस्तक्षेप की आवश्यकता होगी: chownताकि लॉग फाइल अब एप्लिकेशन द्वारा नहीं खोली जा सके, renameलॉग फाइल, उपयुक्त स्वामित्व के साथ एक नया परिशिष्ट-मात्र फ़ाइल बनाएँ, फिर नई खाली फ़ाइल को खोलने के लिए एप्लिकेशन को सूचित करें। ।

आप कॉल करके logger(1)या सिस्टम लॉग में कोई भी एप्लिकेशन लॉग बना सकते हैं syslog(3)


4

आम तौर पर एक डेमॉन के लिए लॉग फ़ाइल बनाई जाती है, rootतब अनुमतियाँ बदल जाती हैं ताकि गैर-विशेषाधिकार प्राप्त उपयोगकर्ता इसे लिख सकें। logrotateफिर रोटेशन के दौरान अनुमतियों को संरक्षित करने के लिए सेट किया गया है।

यदि यह एक कमांड है, डेमॉन नहीं है, तो लॉग इन करें /tmp(अधिमानतः उपयोग करके mktemp) और उपयोगकर्ता को सूचित करें STDOUTकि लॉग कहां गया।


अच्छा विचार। मेरे पास मेरी ~ / .profile में कुछ पंक्तियाँ हैं जो यह देखने के लिए जांचती हैं कि ड्रॉपबॉक्स दानव चल रहा है या नहीं तो यह शुरू होता है। मैं &प्रॉम्प्ट को रखने से बचने के लिए एक जोड़ने पर विचार कर रहा था , लेकिन ड्रॉपबॉक्स को शुरू करना कंसोल को लिखता है। मैं वर्तमान में इसका उत्पादन करने के लिए पुनर्निर्देशित कर रहा हूं /dev/null, लेकिन अगर ड्रॉपबॉक्स शुरू करने में विफल रहता है, तो डिबग करने का कोई तरीका है।
भगवान लोह।

1
जांच करें daemonize
bahamat

बस यह जानने के लिए, "अनुमतियां बदल दी गई हैं ताकि गैर-विशेषाधिकार प्राप्त उपयोगकर्ता इसे लिख सकें।" यह केवल 666 chmod द्वारा किया जाता है? या मुझे उपयोगकर्ता को किसी समूह में जोड़ना होगा या ऐसा कुछ करना होगा?
भगवान लोह।

एक बूट से बचने के लिए बेहतर / var / tmp, / tmp के तहत गारंटी नहीं है
वॉनब्रांड

@ लॉर्डलोह: हाँ, साथ chmod। आमतौर पर 0644या 0664उपयोगकर्ता / समूह के स्वामित्व को भी डेमॉन से बदल दिया जाता है, जो इसे लिखने की उम्मीद करता है।
बहमट

3

मैं इस धारणा के अंतर्गत हूं कि उपयोगकर्ताओं के प्रोग्राम डिफ़ॉल्ट रूप से लॉग को छोड़ने की उम्मीद कर रहे हैं। मैंने विभिन्न कार्यक्रमों को डंप लॉग देखा है जहाँ भी वे ऐसा महसूस करते हैं, और इसका मेरे सिस्टम पर विशेष रूप से स्वागत नहीं होता है; कुछ स्थान पर निर्माण करने की प्रवृत्ति जो कभी भी ध्यान नहीं दिया जाता है जब तक कि / जब तक यह विशाल न हो जाए।

मैं पसंद करूंगा कि क्या उनके लिए कोई निश्चित जगह थी, मैं अपने सिस्टम पर उनके लिए एक स्थिर जगह खोजने की कोशिश कर रहा हूं।

मेरा पहला विचार उपयोग करने का था /var/run/user/$UID/log, लेकिन पाया कि मेरे सिस्टम पर, यह एक टीएमपीएफएस माउंट है, न कि काफी बड़ा, या लॉग के उपयोग के लिए वास्तव में अच्छा है।

उनके लिए जगह बनाएं

चूंकि मुझे समझ में नहीं आता / var / run / user को इसके साथ एकीकृत करने के लिए पर्याप्त है, इसलिए मैंने इसे उपयोगकर्ता द्वारा 1000 के लिए हाथ से अनुकरण करने के लिए चुना है।

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

मैं इस फ़ोल्डर के भीतर संरचना के लिए FHS / var / log spc से चिपके रहने की सलाह दूंगा , लेकिन कल्पना मुक्त-रूप से इसका अनुपालन करने के लिए बहुत कुछ नहीं है।

लॉगरोट को कॉन्फ़िगर करें

आपके सिस्टम द्वारा प्रदान की गई इस निर्देशिका पर कोई मौजूदा लॉग रोटेशन नहीं है, मैं आपके सिस्टम के लिए एक बनाने की सलाह देता हूं:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

नीचे मेरा पिछला / var / run / user / 1000 / log पोस्ट है, मैं इसकी अनुशंसा नहीं कर सकता जब तक आप वास्तव में नहीं जानते कि आपका क्या कर रहा है (और यदि आप ऐसा करते हैं, तो मुझे भी बताएं!)

शायद इस प्रकार है, लेकिन मैं सिर्फ यह बना दिया क्योंकि यह मेरे लिए समझ में आया।

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

/ Var / log / user / 1000 के साथ एकीकृत करें:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

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