दो फ़ाइलों के लिए विभिन्न संदेशों को लॉग करने के लिए लॉगबैक


146

मैं अपनी लॉगिंग करने के लिए logback / slf4j का उपयोग कर रहा हूं। मैं कुछ डेटा का विश्लेषण करने के लिए अपनी लॉग फ़ाइल को पार्स करना चाहता हूं, इसलिए एक बड़ी बड़ी फ़ाइल को पार्स करने के बजाय (ज्यादातर डिबग स्टेटमेंट से) मैं दो लकड़हारा उदाहरण चाहता हूं जो प्रत्येक एक अलग फ़ाइल में लॉग करता है; एनालिटिक्स के लिए एक और सभी उद्देश्य लॉगिंग के लिए एक। किसी को पता है कि क्या यह लॉगबैक के साथ संभव है, या उस मामले के लिए कोई अन्य लकड़हारा?

जवाबों:


296

लॉगबैक में ऐसा कुछ करना बहुत संभव है। यहाँ एक उदाहरण विन्यास है:

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

फिर आप दो अलग-अलग लॉगर्स को सेटअप करेंगे, एक सब कुछ के लिए और एक एनालिटिक्स डेटा लॉग करने के लिए जैसे:

Logger analytics = LoggerFactory.getLogger("analytics");

1
मुझे इस तरह का काम करने की आवश्यकता है ताकि मैं एक ही फाइल के लिए एक बिना लाइन-फीड परिशिष्ट और एक नियमित परिशिष्ट रख सके। इस जानकारी के लिए धन्यवाद।
दिजांगोफ़ान

IMO की संवेदनशीलता = असत्य हो तो डिफ़ॉल्ट होना चाहिए यदि अलग-अलग परिशिष्ट-रेफ निर्दिष्ट किया गया हो। बहुत बार हमें आवेदन मिलता है जिसमें कुछ टाइमर घटनाओं के कारण कुछ मॉड्यूल बहुत अक्सर लॉग जनरेटर होंगे, और हम उन लॉग को अलग-अलग फाइलों में अलग करना चाहेंगे। 10 अलग-अलग फ़ाइलों में एक ही लॉग लॉग करना वास्तव में कोई मतलब नहीं है। तो यह डिफ़ॉल्ट रूप से नहीं सुविधा में एक विकल्प होना चाहिए। चूंकि लॉगबैक एक फिर से लिखना था, उसी गलती को उसी लेखक द्वारा सही किया जाना चाहिए था।
समरजीत सामंत

मैं क्रमशः विभिन्न फाइलों में त्रुटि, डिबग, सूचना संदेशों को लॉग करना चाहता हूं। क्या यह Logback.xml के साथ संभव है
कासिम

@Qimim - यह संभव है। देखें - amitstechblog.wordpress.com/2014/09/27/…
एंडी

मैं विभिन्न पैकेजों से विभिन्न फाइलों में लॉग इन करने की कोशिश कर रहा हूं जैसे कि यह उत्तर सुझाता है लेकिन यह मेरे लिए काम नहीं करता है। मेरा लॉगबैक xml एक्सट्रैक्शन यहाँ है - pastebin.com/Aii4f1Jk । मैं हाइबरनेट पैकेज TRACE स्तर लॉग को एक अलग फ़ाइल में लॉग इन करने की कोशिश कर रहा हूं। कोई सुझाव?
एंडी डफ्रेसने

7

आप जितने चाहें उतने लकड़हारे हो सकते हैं। लेकिन, यह बेहतर है कि आपके पास प्रत्येक पैकेज के लिए एक है जिसे आपको अलग-अलग लॉग इन करना होगा। तब उस पैकेज और उसके सब-पैकेज की सभी कक्षाएं उस विशिष्ट लकड़हारे को मिल जाएंगी। वे सभी रूट लॉगर को साझा कर सकते हैं और अपने लॉग डेटा को रूट लॉगर ऐपेंडर में एडिटिविटी = "ट्रू" का उपयोग करके भेज सकते हैं। यहाँ एक उदाहरण है:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>


2

मेरे मामले में मैं लॉग नाम के रूप में कक्षा के नाम छोड़ना चाहता था

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

और चूंकि मेरे पास ऐसी कुछ कक्षाएं थीं, इसलिए मेरी logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.