एक लॉग फ़ाइल बनाओ


22

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


कृपया ध्यान दें कि प्रोग्रामिंग प्रश्न आम तौर पर ऑफ-टॉपिक होते हैं; आपको उन्हें स्टैक ओवरफ्लो पर पूछना चाहिए । एपीआई की एक व्याख्या यहां ठीक है, लेकिन सी या अन्य प्रोग्रामिंग भाषा में इसका उपयोग करने का स्पष्टीकरण सामान्य रूप से स्टैक ओवरफ्लो पर है।
गाइल्स का SO- बुराई पर रोक '22

जवाबों:


31

C प्रोग्राम से लॉग इन करने का मानक तरीका है syslog

हेडर फ़ाइल को शामिल करके प्रारंभ करें:

#include <syslog.h>

फिर अपने कार्यक्रम की शुरुआत में, आपको कॉल करके syslog को कॉन्फ़िगर करना चाहिए openlog:

openlog("programname", 0, LOG_USER);

पहला तर्क पहचान या टैग है, जो प्रत्येक संदेश की शुरुआत में स्वचालित रूप से जोड़ा जाता है। अपने प्रोग्राम का नाम यहाँ रखें।

दूसरा तर्क वे विकल्प हैं जिनका आप उपयोग करना चाहते हैं, या 0सामान्य व्यवहार के लिए। विकल्पों की पूरी सूची में है man 3 syslog। एक जो आपको उपयोगी लग सकता है LOG_PID, वह है जो लॉग संदेश में प्रक्रिया आईडी को रिकॉर्ड करता है।

फिर, हर बार जब आप लॉग संदेश लिखना चाहते हैं, तो आप कॉल करते हैं syslog:

syslog(LOG_INFO, "%s", "Message");

पहला तर्क प्राथमिकता है। से प्राथमिकता पर्वतमाला DEBUG(कम से कम महत्वपूर्ण) के EMERGसाथ (केवल आपात स्थिति के लिए) DEBUG, INFOऔर ERRसबसे अधिक इस्तेमाल किया जा रहा है। man 3 syslogअपने विकल्पों के लिए देखें ।

दूसरे और तीसरे तर्क प्रिंटफ़ की तरह एक प्रारूप और एक संदेश हैं।

यह किस लॉग फ़ाइल में दिखाई देता है यह आपकी syslog सेटिंग्स पर निर्भर करता है।

एक डिफ़ॉल्ट सेटअप के साथ, यह संभवतः में चला जाता है /var/log/messages


आप श्रेणी में सुविधाओं में से एक का उपयोग करके एक कस्टम लॉग फ़ाइल सेट कर सकते हैं LOG_LOCAL0करने के लिए LOG_LOCAL7

आप उन्हें बदलकर उपयोग करते हैं:

openlog("programname", 0, LOG_USER);

सेवा मेरे

openlog("programname", 0, LOG_LOCAL0);

या

openlog("programname", 0, LOG_LOCAL1);

आदि।

और /etc/syslog.conf, उदाहरण के लिए , इसी प्रविष्टि को जोड़ना

local1.info /var/log/programname.log

और syslog सर्वर को पुनरारंभ करना, जैसे

pkill -HUP syslogd

.infoके हिस्से के local1.infoऊपर का मतलब है सभी संदेशों हैं कि INFOया अधिक महत्वपूर्ण लॉग इन किया जाएगा, सहित INFO, NOTICE, ERR(त्रुटि), CRIT(महत्वपूर्ण), आदि, लेकिन नहीं DEBUG


या, यदि आपके पास है, तो आप rsyslogएक संपत्ति-आधारित फ़िल्टर की कोशिश कर सकते हैं , जैसे

:syslogtag, isequal, "programname:"    /var/log/programname.log

Syslogtag में ":" होना चाहिए।

या, यदि आप अपने सॉफ़्टवेयर को अन्य लोगों को वितरित करने की योजना बना रहे हैं, तो संभवतः इसका उपयोग LOG_LOCALया rsyslogफ़िल्टर पर भरोसा करने के लिए एक अच्छा विचार नहीं है ।

उस स्थिति में, आपको LOG_USER(यदि यह एक सामान्य प्रोग्राम है) या LOG_DAEMON(यदि यह एक सर्वर है) का उपयोग करना चाहिए, तो अपने स्टार्टअप संदेशों और त्रुटि संदेशों का उपयोग करके syslogलिखें, लेकिन अपने सभी लॉग संदेशों को किसी फ़ाइल के बाहर लिखें syslog। उदाहरण के लिए, अपाचे एचटीटीपी लॉग करता है /var/log/apache2/*या /var/log/httpd/*, मैं नियमित open/ fopenऔर write/ printfकॉल का उपयोग करता हूं ।


धन्यवाद। यह काफी उपयोगी जानकारी है। लेकिन क्या आप कृपया log_local0-7 विकल्प पर अधिक व्याख्या करेंगे। उदाहरण के लिए। मैं self.log फ़ाइल में अपना डेटा (जिसमें लॉग लाइन में <self> शब्द है) लिखना चाहता हूं। और अन्य फ़ाइलों में कुछ लॉग।
सुशांत जैन

@ सुशांत जैन: लिनक्स वितरण और संस्करण क्या आप लक्षित कर रहे हैं? क्या आपके पास पुराना syslog (ksyslogd) या rsyslog है? rpm -qa | grep syslogया dpkg -l '*syslog*'शायद आपको बताएंगे कि कौन सा।
मिकेल

log_local * हैं, स्पष्ट रूप से, पीछे से अवशेष जब sysklogdsyslog सॉफ़्टवेयर के लिए शहर में एकमात्र गेम था। आजकल सॉफ्टवेयर पसंद है syslog-ng, rsyslogऔर dsyslogमौजूद है और बस सेवा / स्तर की तुलना में बहुत अधिक परिष्कृत फ़िल्टरिंग क्षमताएं हैं।
शादुर

बहुत बहुत धन्यवाद। मेरी समस्या हल हो गई है। मेरे पास लॉग फ़ाइल में संग्रहीत डेटा पार्स करने के बारे में एक और प्रश्न है। क्या ऐसा करने का कोई अच्छा तरीका है। दरअसल मैं एक सिस्टम स्टैटिस्टिक्स टूल बनाने की कोशिश कर रहा हूं। इसलिए मुझे इसकी आवश्यकता है।
सुशांत जैन

@ सुशांत जैन मदद करने में खुशी। कृपया अपने लॉग पार्सिंग प्रश्न को एक अलग प्रश्न के रूप में पोस्ट करें ताकि लोग इसे देख सकें और उचित उत्तर प्रदान कर सकें।
मिकेल

2

आप चाहते हैं #include <syslog.h>, तो syslog()जो भी सिस्टम लॉगिंग प्रोग्राम सक्रिय है, उसे डेटा भेजने के लिए फ़ंक्शंस का उपयोग करें ।

मैन पेज यहाँ देखें ।


syslog () फ़ंक्शन डेटा को / var / log / syslog में लिखता है। जबकि मैं अपनी फ़ाइल में लॉग लिखना चाहता हूं।
सुशांत जैन

जैसा कि मिकेल नीचे बताते हैं कि आप अपने लॉग संदेशों को इस तरह से टैग कर सकते हैं कि syslog समझें कि आप किस प्रोग्राम में हैं, तो अपने प्रोग्राम लॉग संदेशों को एक अलग फ़ाइल में लिखने के लिए syslog को कॉन्फ़िगर करें।
कालेब

1

संभावनाएं बहुत हैं, आपकी योजना क्या है? क्या आपको कमांड लाइन से लॉग इन करने के लिए केवल एक विकल्प की आवश्यकता है? एक नज़र डालें logger( bsdutils में शामिल )। बस टाइप करो:

usr@srv % logger test

और यह आपके लिए कुछ इस तरह लॉग करेगा /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

यह भी देखना man logger। अपने लॉगिंग डेमॉन के आधार पर आप इन संदेशों को विशिष्ट फ़ाइलों को सॉर्ट कर सकते हैं या प्राथमिकता से फ़िल्टर कर सकते हैं।

विभिन्न प्रोग्रामिंग भाषाओं के लिए कुछ समाधान भी हैं, इसलिए कृपया मुझे बताएं कि आप क्या करना चाहते हैं ;-)


वास्तव में मैं इसे सी भाषा का उपयोग करके करना चाहता हूं। और मुझे mikel पोस्ट में जानकारी मिली है।
सुशांत जैन

1

प्रोग्राम नाम से फ़िल्टरिंग को ऊपर बताए rsyslogगए तरीकों से अलग-अलग लिखा गया है, हाल के संस्करणों के लिए (मेरी मशीन पर संस्करण 5.8.6 है) जैसा कि नीचे दिखाया गया है:

if $programname == 'popa3d' then /var/log/popa3d.log

अधिक जानकारी के लिए, यहां देखें

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