कंसोल और फ़ाइल परिशिष्ट का उपयोग करके बहुत ही सरल log4j2 XML कॉन्फ़िगरेशन फ़ाइल


223

मैं सांत्वना और log4j2 का उपयोग कर एक फ़ाइल परिशिष्ट के साथ एक बहुत ही सरल XML विन्यास फाइल चाहता हूँ।

(अपाचे वेबसाइट मुझे बहुत जानकारी के साथ मार रहा है।)


72
हहा - तो खुशी से आपने यह कहा "(अपाचे वेबसाइट मुझे बहुत जानकारी के साथ मार रही है।)"
thonnor

19
आपका यह वाक्य (अपाचे वेबसाइट मुझे बहुत जानकारी के साथ मार रहा है।) मुख्य कारण है कि मैं आपका प्रश्न क्यों देख रहा हूं!
जू ओलिवेरा

जवाबों:


281
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

टिप्पणियाँ:

  • निम्न सामग्री को अपनी कॉन्फ़िगरेशन फ़ाइल में रखें।
  • कॉन्फ़िगरेशन फ़ाइल का नाम log4j2.xml
  • Log4j2.xml को उस फ़ोल्डर में रखें जो क्लास-पाथ में है (यानी आपका सोर्स फोल्डर "src")
  • Logger logger = LogManager.getLogger();अपने लकड़हारे को आरंभ करने के लिए उपयोग करें
  • मैंने तत्कालFlush = "गलत" सेट किया क्योंकि यह SSD जीवनकाल के लिए बेहतर है । यदि आपको लॉग-इन की तुरंत लॉग-इन की आवश्यकता है तो फ़ाइल को पैरामीटर को हटा दें या इसे सही पर सेट करें

1
पूर्णता के लिए, Async Loggers या AsyncAppender का उपयोग करते समय तत्कालFlush = "false" का उपयोग विशेष रूप से अनुशंसित है।
रेमको पोपमा

1
पृष्ठभूमि: तत्कालFlush = "गलत" एक लॉग डिस्क में एक साथ कई लॉग ईवेंट को लॉग करने के लिए Log4J2 के async घटकों की अनुमति देता है। एक बोनस के रूप में, आपके सबसे हालिया लॉग इवेंट्स को हमेशा डिस्क पर लिखा जाता है और मेमोरी बफर में कभी भी लटका हुआ नहीं छोड़ा जाता है। (कुछ मुझे log4j-1.2 के बारे में गुस्सा आता है।)
रेम्को पोपमा

1
मैं काम करने के लिए Log4j 2.0 साइट पर उदाहरण नहीं मिल सका, लेकिन इस एक ने किया। धन्यवाद।
djangofan

12
कृपया इस तथ्य को जोड़ें कि ग्रहण का उपयोग करने वालों के लिए एक स्वच्छ की आवश्यकता हो सकती है। मानव जाति की खातिर।
रीट शरबानी

1
@ThorstenNiehues मैं अपनी पिछली टिप्पणी को संपादित नहीं कर सकता, लेकिन जब आप निर्माण करते हैं तो ग्रहण की प्रतिलिपि ग्रहण करता है, और किसी कारण से यह हमेशा लॉग 4j.xml को कॉपी नहीं करता है भले ही यह बदल गया हो। कम से कम मेरे लिए इसका हल क्या है।
रीट शरबानी

19

यहाँ मेरा सरलीकरण है log4j2.xmlजो एक दैनिक रोलिंग फ़ाइल को सांत्वना और लिखने के लिए प्रिंट करता है:

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

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

modulate (बूलियन) - इंगित करता है कि अंतराल को समायोजित किया जाना चाहिए ताकि अगले रोलओवर अंतराल सीमा पर घटित हो। उदाहरण के लिए, यदि आइटम घंटे है, तो वर्तमान समय 3 बजे है और अंतराल 4 है तो पहला रोलओवर सुबह 4 बजे होगा और फिर अगले दिन 8 बजे, दोपहर, 4 बजे, आदि होंगे।

स्रोत: https://log.apache.org/log4j/2.x/manual/appenders.html

आउटपुट:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

पिछले दिन स्वचालित रूप से नया नाम बनाने के लिए एक नई लॉग फ़ाइल बनाई जाएगी:

cucumber_yyyy-MM-dd.log

मावेन परियोजना में, आप याlog4j2.xml में डाल देंगे ।src/main/resources src/test/resources


12

log4j2 में एक बहुत ही लचीली विन्यास प्रणाली है (जो IMHO एक मदद से अधिक व्याकुलता है), आप JSON का उपयोग भी कर सकते हैं। संदर्भ के लिए https://log.apache.org/log4j/2.x/manual/configuration.html देखें ।

व्यक्तिगत रूप से, मैंने अभी हाल ही में log4j2 का उपयोग करना शुरू किया था, लेकिन मैं "सख्त XML" कॉन्फ़िगरेशन (जो कि तत्व नामों के बजाय विशेषताओं का उपयोग कर रहा हूं) की ओर रुझान कर रहा हूं, जिसे स्कीमा-मान्य किया जा सकता है।

यहाँ मेरा सरल उदाहरण है ऑटोकॉन्फ़िगरेशन और सख्त मोड का उपयोग करके, फ़ाइल नाम सेट करने के लिए "संपत्ति" का उपयोग करना:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

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

यहाँ क्या Fileनीति है? अधिकतम फ़ाइल आकार क्या है? और यह फाइल करने के लिए कैसे लिखता है? (फ़ाइल में हमेशा लॉग के अंतिम 10 ग्राम होते हैं?)
टीना जे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.