2012-11-08 26 views
8

मुझे जिस कार्यक्षमता की आवश्यकता है वह कॉन्फ़िगर किए गए लॉग फ़ाइल की शुरुआत में हेडर लाइन लिख रहा है। लॉग फ़ाइल को, इसके अलावा, एक समय पैटर्न (मैं लॉगबैक 1.0.7 बात कर रहा हूं) के आधार पर पर घुमाया जाना चाहिए।कस्टम लॉगबैक एपेंडर - फ़ाइल हेडर तैयार करना और इसे रोलओवर बनाना

तो, मैं एक appender लिखने की सोच रहा हूँ - हालांकि मुझे यकीन है कि नहीं है कि क्या यह एक कस्टम लेआउट कि मैं वास्तव में जरूरत नहीं है हूँ।

1) appender

प्रति logback के प्रलेखन, सही दृष्टिकोण AppenderSkeleton विस्तार करने के लिए है, लेकिन फिर मैं कैसे दूसरी ओर RollingFileAppender (फ़ाइल रोल ओवर बनाने के लिए?)

के साथ इस गठबंधन होगा हाथ, अगर मैं RollingFileAppender का विस्तार करता हूं, तो मौजूदा कार्यक्षमता को सजाने के लिए मैं किस विधि को ओवरराइड करता हूं? मैं फ़ाइल की शुरुआत में केवल उस विशेष स्ट्रिंग को लिखने के लिए कैसे कहूं?

2) लेआउट

Analogously, दृष्टिकोण LayoutBase का विस्तार किया जाना है, और doLayout(ILoggingEvent event) के लिए एक कार्यान्वयन प्रदान करने लगता है। लेकिन फिर से, मुझे नहीं पता कि व्यवहार को कैसे सजाने के लिए - फ़ाइल में एक नई लाइन जोड़ना, इसकी कार्यक्षमता को बाधित करने के बजाय (क्योंकि मैं अभी भी बाकी लॉग को ठीक से दिखाना चाहता हूं)।

getFileHeader()LayoutBase में आशाजनक लग रहा है, लेकिन मैं इसका उपयोग कैसे करूं? क्या यह कस्टम लेआउट द्वारा ओवरराइड होने का भी इरादा है? (शायद हां, क्योंकि यह लेआउट इंटरफ़ेस का हिस्सा है, लेकिन फिर कैसे?)

धन्यवाद!

उत्तर

10

यहां मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं, अगर किसी और को एक ही समस्या में आता है। यह कैसे मैं अंत में यह (हालांकि पता नहीं है अगर यह रूढ़िवादी तरीका है) किया है:

AppenderSkeleton विस्तार की

इसके बजाय, मैं RollingFileAppender बढ़ाया (रोलओवर कार्यक्षमता रखने के लिए), और इसके विधि OpenFile() overrode। यहां मैं लॉग फ़ाइल में हेरफेर कर सकता हूं और इसमें हेडर लिख सकता हूं, इसे डिफ़ॉल्ट रूप से करने के लिए जो भी करना है उसे करने के बाद। इस तरह:

public void openFile(String fileName) throws IOException { 
     super.openFile(fileName); 
     File activeFile = new File(getFile()); 
     if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) { 
      FileUtils.writeStringToFile(activeFile, header); 
     } 
    } 

मैं logback.xml में हेडर से कॉन्फ़िगर किया गया है, इस के रूप में सरल रूप में: <header> value </header>। यह मेरे नए एपेंडर के हेडर फ़ील्ड में इंजेक्ट करता है।

समस्याओं के बिना काम करने लगता है, लेकिन यदि आप बेहतर तरीके से जानते हैं तो कृपया पोस्ट करें!

+0

@teo क्या आप जानते हैं कि हम कैसे कस्टम गुण किसी भी कस्टम appender वर्ग के शुरू होने से विधि में logback.xml में परिभाषित कर सकते हैं करते हैं? – Mihir

4

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

public void openFile(String fileName) throws IOException 
{ 
    super.openFile(fileName); 
    File activeFile = new File(getFile()); 
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) 
    { 
     lock.lock(); 
     try 
     { 
      new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header"); 
     } 
     finally 
     { 
      lock.unlock(); 
     } 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^