Log4j के साथ विभिन्न सामग्री के कई लॉग फाइल बनाना


81

क्या लॉग 4 जे को कॉन्फ़िगर करने का एक तरीका है ताकि यह विभिन्न एपेंडरों को लॉगिंग के विभिन्न स्तरों को आउटपुट करे?

मैं कई लॉग फ़ाइल सेट करने का प्रयास कर रहा हूं। मुख्य लॉग फ़ाइल सभी वर्गों के लिए सभी जानकारी और उपरोक्त संदेशों को पकड़ लेगी। (विकास में, यह सभी DEBUG और उपरोक्त संदेशों और विशिष्ट कक्षाओं के लिए TRACE को पकड़ लेगा।)

फिर, मैं एक अलग लॉग फ़ाइल रखना चाहूंगा। वह लॉग फ़ाइल कक्षाओं के एक विशिष्ट सबसेट के लिए सभी DEBUG संदेशों को पकड़ लेगी, और किसी अन्य वर्ग के सभी संदेशों को अनदेखा कर देगी।

वहाँ एक तरीका है पाने के लिए मैं क्या कर रहा हूँ?

धन्यवाद, डैन

java  log4j 

3
क्या आपका मतलब है कि आप डेबग को पकड़ने के लिए एक लॉगफाइल चाहते हैं और केवल इन्फोबो पर कब्जा करने के लिए एक और लॉगफाइल है, और केवल इनफो को कैप्चर करना है, और इसी तरह?
एडी

जवाबों:


70

इससे आप कार्य शुरू कर पाएंगे:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
बहुत अंतिम पंक्ति क्या करती है?
djangofan

1
@djangofan एक कस्टम पैकेज / क्लास लॉग लेवल (यानी com.yourpackage.yourclazz को TRACE लॉगिंग) के साथ सेट करता है, हालाँकि इस मामले में यह पहले से ही डिफ़ॉल्ट था (लाइन 1 पर सेट)। IMO यह उदाहरण बेहतर होगा यदि रूटलॉगर में INFO और "yourclass" में DEBUG था।
टॉम क्लिफ्ट

पहली पंक्ति के पैरामीटर TRACE, QuietAppender, LoudAppender नहीं QuietAppender, LoudAppender, TRACE होना चाहिए
रिचर्ड व्हाइटहेड

26

शायद ऐसा कुछ हो?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

इस प्रकार, सभी जानकारी संदेश server.log को लिखे जाते हैं; इसके विपरीत, foo.log में केवल com.example.foo संदेश हैं, जिसमें डीबग-स्तर संदेश भी शामिल हैं।


Com.example.foo एक पैकेज या एक वर्ग है?
वाह

1
@WowBow यह या तो हो सकता है, लेकिन इस तरह एक नाम के साथ यह एक पैकेज की तरह दिखता है।
लकड़हारे के

धन्यवाद। मैंने दोनों के पूछने के बाद और दोनों के लिए काम करने की कोशिश की;)
वाह

7

मेरे पास यह सवाल था, लेकिन एक मोड़ के साथ - मैं विभिन्न सामग्रियों को अलग-अलग फ़ाइलों में लॉग इन करने की कोशिश कर रहा था। मेरे पास लॉवेल डिबग लॉग और हाईलेवल यूजर लॉग के लिए जानकारी थी। मैं चाहता था कि LowLevel केवल एक फ़ाइल में जाए, और HighLevel दोनों एक फ़ाइल में जाए, और एक sloglogd।

मेरा समाधान 3 एपेंडरों को कॉन्फ़िगर करना था, और फिर लॉगिंग को इस तरह सेटअप करना था:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

जो हिस्सा मेरे लिए मुश्किल था, वह यह था कि 'log4j.logger' में कई एपेंडरों को सूचीबद्ध किया जा सकता था। मैं एक समय में इसे एक पंक्ति में करने की कोशिश कर रहा था।

उम्मीद है कि यह किसी बिंदु पर किसी की मदद करता है!


3

मुख्य लॉगफाइल / एपेन्डर के लिए, अपॉइंटमेंट .Threshold = INFOमें लॉग इन करें जो वास्तव में जानकारी के लिए और उसके ऊपर अपॉइंटमेंट में लॉग इन है, भले ही लॉगबर्स के पास DEBUG, TRACE इत्यादि हो, सक्षम हो।

DEBUG को पकड़ने और इससे ऊपर कुछ भी नहीं करने के लिए ... आपको शायद एक कस्टम परिशिष्ट लिखना होगा।

हालांकि मैं ऐसा नहीं करने की सलाह दूंगा, क्योंकि ऐसा लगता है कि यह समस्या निवारण और विश्लेषण को बहुत कठिन बना देगा:

  1. यदि आपका लक्ष्य एक एकल फ़ाइल है जहाँ आप किसी समस्या का निवारण कर सकते हैं, तो विभिन्न फ़ाइलों पर आपके लॉग डेटा को फैलाना कष्टप्रद होगा - जब तक कि आपके पास बहुत ही प्रतिगामी नीति नहीं होगी, तब तक आपको DEBUG और INFO दोनों से सामग्री की आवश्यकता होगी प्रभावी रूप से समस्याग्रस्त कोड के निष्पादन का पता लगाने में सक्षम हो।
  2. अभी भी अपने सभी डिबग संदेशों को लॉग करके, आप लॉगिंग (नीचे) को चालू करके आमतौर पर उत्पादन प्रणाली में प्राप्त किसी भी प्रदर्शन लाभ को खो रहे हैं।

मुझे अपने लक्ष्य को बेहतर तरीके से बताना चाहिए था। ऐप में कहीं भी ट्रैकिंग, त्रुटियों, असामान्य स्थितियों आदि के लिए मुख्य लॉग है - इस लॉग को छोटा रखा जाना आवश्यक है, इसलिए यह नियमित रूप से रोल करता है। विशेष लॉग एक सबसिस्टम के व्यवहार को ट्रैक करता है, और इसे लंबे समय तक रखने की आवश्यकता होती है।

क्या आप दूसरी लॉग फ़ाइल से ERROR, WARN, INFO संदेशों को बाहर करना चाहते हैं?
मैट बी

और XML में आप पैरामीटर थ्रेशोल्ड को इस तरह से जोड़ सकते हैं: <परिशिष्ट नाम = "ERROR_FILE"> <परम नाम = "थ्रेसहोल्ड" मान = "ERROR" /> </ परिशिष्ट>
razor

0

डेमो लिंक: https://github.com/RazvanSebastian/spring_multiple_log_files_memo.it

मेरा समाधान XML कॉन्फ़िगरेशन का उपयोग करके आधारित है spring-boot-starter-log4j। उदाहरण का उपयोग करके एक मूल उदाहरण है spring-boot-starterऔर दो लॉगर्स विभिन्न लॉग फ़ाइलों में लिखते हैं।

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