log4j2

2015-11-12 13 views
5

में डुप्लिकेट संदेशों को दबाने के लिए कैसे करें मैं जावा और log4j2 के लिए काफी नया हूं, इसलिए शायद अजीब प्रश्न के लिए खेद है। मेरी समस्या निम्नलिखित है। मैंने एक एप्लीकेशन लिखा जो लॉगिंग के लिए log4j2 का उपयोग करता है। कार्यक्रम डेटा का विश्लेषण करता है और मामले में एक चेतावनी लिखता है क्योंकि दिए गए स्ट्रिंग को वांछित के रूप में पार्स नहीं किया जा सका। कभी-कभी प्रोग्राम को बहुत अप्रत्याशित तार मिलते हैं और इस प्रकार यह एक ही त्रुटि संदेश के सभी समय लॉग करता है। तो, सवाल यह है कि, एक ही त्रुटि संदेश को बार-बार लॉग इन करने से कैसे बचें। उदाहरण के लिए लॉगफाइल में 2000 बार एक ही त्रुटि संदेश देखने के लिए, मैं लॉगफाइल में एक संकेत देना चाहता हूं कि यह त्रुटि संदेश x-times लिखा गया था। मेरे वर्तमान log4j2 कॉन्फ़िग फ़ाइल नज़र इस प्रकार है:log4j2

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Properties> 
     <Property name="pattern">%d{DEFAULT} %-5p %-18.18c %4.4L [%-15.15t] %m%n</Property> 
    </Properties> 

    <Appenders> 
     <Console name="STDERR" target="SYSTEM_ERR"> 
      <PatternLayout pattern="${pattern}" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Root level="warn"> 
      <AppenderRef ref="STDERR" /> 
     </Root> 
    </Loggers> 
</Configuration> 

उत्तर

0

मैं दुर्भाग्य से वर्तमान में मुझ पर कोड की जरूरत नहीं है, लेकिन यह कैसे आप इस (वहाँ पहले से ही है और वहाँ बहुत अच्छी तरह से हो सकता है एक समाधान) का समाधान कर सकते हैं।

आप एक नया ऐपेंडर बना सकते हैं जो आपकी फ़ाइल/कंसोल पर असीमित रूप से लॉग इन करता है।

एपेंडर में, आप स्वयं को एकत्रीकरण लागू कर सकते हैं। जब भी कोई लॉगवेन्ट आता है, तुरंत इसे लिखने के बजाय, जांच लें कि आपने पहले संदेश देखा है या नहीं। यदि आपने किया है, तो इसे लॉगिंग करने के बजाय, अपने काउंटर को बढ़ाएं।

आखिरकार, उन समेकित लॉग इवेंट को एक समेकित संदेश में बदलें और प्रक्रिया करें जो आपके हजार लॉग ईवेंट की बजाय एक है।

यह आपके एसिंक्रोनस एपेंडर बेस पर दूसरे कार्यकर्ता के साथ हल किया जा सकता है (उदाहरण के लिए)। आम तौर पर (मैं लॉकबैक देख रहा हूं, लेकिन मुझे लगता है कि यह आपके लिए काफी समान होगा), एसिंक्रोनस एपेंडर एक कतार में ईवेंट जोड़ना समाप्त कर देते हैं जिसे उस कतार से काम करने वाले एक अलग थ्रेड द्वारा संसाधित किया जाएगा।

आपके पास अपने समेकित संदेशों के लिए एक अलग कतार हो सकती है, और एक कार्यकर्ता जो हर 5 सेकंड में चलता है। यदि उन 5 सेकंड में एक ही संदेश को कई बार देखा गया है, तो आपका कार्यकर्ता उस संदेश को जोड़ सकता है और उसे कतार में संसाधित करने के लिए रख सकता है ताकि अंततः लॉग में समाप्त हो जाए।

मुझे आशा है कि मदद करता है,

Artur

पी.एस .: साथ अपने config के संबंध, बस अपने कस्टम appender के योग के साथ appender कंसोल की जगह। यदि आप कंसोल चाहते हैं, तो बस उस एपेंडर को बढ़ाएं और इसे वही करें जो आप करना चाहते हैं :)

+0

वास्तव में यह मतलब हो सकता है बल्कि एक सामान्य AppenderWrapper अपने वास्तविक appender को सौंपने के लिए। इसलिए यदि आप अब कंसोल एपेंडर को पसंद नहीं करते हैं तो आप आसानी से एपेंडर्स को आसानी से स्विच कर सकते हैं। – philnate

+0

आप फ़िल्टर का उपयोग कर एक ही चीज़ प्राप्त कर सकते हैं। घटनाओं के खिलाफ मिलान करने के लिए फ़िल्टर को कई पैटर्न के साथ आपूर्ति की जा सकती है। यदि फ़िल्टर पैटर्न से मेल खाता है, तो यह इसे एक मेमोरी स्टोरेज में खिलाता है और ईवेंट को प्रचार से रोकता है। इन-मेमोरी-स्टोरेज बीन में आपके एग्रीगेशन को लॉग इन करने के लिए केवल सादे पुराने लॉग का उपयोग करके एक कार्यकर्ता हो सकता है (बंद होने पर छल लिखना सुनिश्चित करें)।इस तरह आप बस अपने सभी एग्रीगेटर्स का पुनः उपयोग कर सकते हैं और फ़िल्टर को काम को डॉट कर सकते हैं। – pandaadb

0

यह लॉगऑनजे 2 प्लगइन बनाना संभव है जो यह करता है लेकिन मैं तर्क दूंगा कि लॉगिंग लाइब्रेरी सर्वश्रेष्ठ नहीं है इसे संबोधित करने के लिए जगह।

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

(यह एक से अधिक संदेशों को ट्रैक करने के विपंक्ति से संबंधित सामान्य बनाया जा सकता है।)

संबंधित मुद्दे