2010-10-18 13 views
6

क्या लॉग 4नेट कस्टम PatternLayoutConverter बनाना संभव है जो "इंडेक्स" मान को कॉन्फ़िगर करने की अनुमति देता है?कस्टम लॉग 4नेट प्रॉपर्टी PatternLayoutConverter (इंडेक्स के साथ)

ThreadContext.Properties["ID"] = yourID; 

और इस तरह निर्दिष्ट करें::

%property{ID} 

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

क्या होगा यदि मैं जो मूल्य लॉग करना चाहता हूं वह कुछ अन्य "शब्दकोश" में है? मुझे लगता है कि मैं उन मानों को प्रतिलिपि से लॉग 4नेट संदर्भों में से एक में कॉपी करने के लिए कुछ तर्क लिख सकता हूं और फिर %property टोकन में निर्मित का उपयोग कर सकता हूं। क्या होगा यदि मैं config4net को कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट इंडेक्स मान के आधार पर सीधे अपने "शब्दकोश" से मूल्यों को लॉग इन करना चाहता हूं?

%myproperty{ID} 

और फिर अपने ही "शब्दकोश" से संबंधित "आईडी" मूल्य खींच:

मैं अपने खुद के PatternLayoutConverter है कि मुझे कुछ इस तरह कॉन्फ़िगर करने की अनुमति होगी लिख सकते हैं?

किसी को भी है कि रुचि रखता है के लिए, यह NLog साथ एक ही बात करने के लिए बहुत आसान है:

[LayoutRenderer("MyGDC")] 
    class GdcLayoutRenderer : LayoutRenderer 
    { 
    [RequiredParameter] 
    [DefaultParameter] 
    public string Item { get; set; } 

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
    { 
     string msg = GDC.Get(this.Item); 
     builder.Append(msg); 
    } 

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent) 
    { 
     return 10; 
    } 
    } 

और इस तरह से कॉन्फ़िगर किया गया:

एक्सटेंशन के साथ बताओ NLog किसी भी विधानसभाओं के बारे में:

<extensions> 
    <add assembly="NLog.Extensions"/> 
    </extensions> 

एक लेआउट में "अनुक्रमित" संपत्ति का उपयोग करें:

<layout="${longdate} | ${MyGDC:item=name} | ${message}"/> 

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

[संपादित करें] मुझे वह जवाब मिला जो मैं चाहता था। मैंने यहां अपने नमूना PatternLayoutRenderer के लिए कोड शामिल किया है। मेरे परीक्षण में, मेरे पास मेरे मुख्य फॉर्म क्लास में एक स्थिर शब्दकोश है जहां मैं "एप्लिकेशन सेटिंग्स" स्टोर कर सकता हूं। मैंने एक PatternLayoutConverter बनाया है जो पैरामीटर के रूप में एक कुंजी स्वीकार कर सकता है ताकि कनवर्टर शब्दकोश में सही मान देख सके। मैं log4net (या NLog) संदर्भ ऑब्जेक्ट्स का उपयोग करके समान कार्यक्षमता प्राप्त करने में सक्षम हो सकता हूं, लेकिन हमारे एप्लिकेशन में हमारे पास कुछ सेटिंग्स या सत्र जानकारी हो सकती है जो एप्लिकेशन अन्य उद्देश्यों के लिए रखेगा और हम इसे जोड़ना चाहते हैं लॉगिंग आउटपुट। चूंकि यह पहले से ही लुकअप स्ट्रक्चर में होगा, इसलिए यह लॉग 4नेट (या एनएलओजी संदर्भ) को स्पष्ट रूप से कॉपी करने के बजाय डेटा को संदर्भित करने में सक्षम होना अच्छा होगा।

namespace Log4NetTest 
{ 
    class KeyLookupPatternConverter : PatternLayoutConverter 
    { 
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) 
    { 
     //Use the value in Option as a key into the "application settings" stored on the main form. 
     string setting; 
     if (Form1.AppSettings.TryGetValue(Option, out setting)) 
     { 
     writer.Write(setting); 
     } 
    } 
    } 
} 

लेआउट विन्यास:

//Log the "sessionid" and "userid" values from our "application settings" object 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/> 
    <converter> 
     <name value="KLPC" /> 
     <type value="Log4NetTest.KeyLookupPatternConverter" /> 
    </converter> 
    </layout> 

उत्तर

4

मैं इसे करने की कोशिश नहीं की, बल्कि यह काम करना चाहिए

वैसे भी, यहाँ कोड है।

%converterName{converterOptions} 

उदाहरण के लिए तारीख पैटर्न कनवर्टर इस तरह इस्तेमाल किया जा सकता: log4net में आप इस तरह एक पैटर्न कनवर्टर के लिए एक विकल्प स्ट्रिंग पारित कर सकते हैं

%date{HH:mm:ss,fff} 

इसका मतलब है आप अपने पैटर्न कनवर्टर लिख सकते हैं जिस तरह से आपने सुझाव दिया था। ऐसे कनवर्टर के लिए एक साधारण उदाहरण here पाया जा सकता है।

Convert विधि में आप संपत्ति 'विकल्प' (PatternConverter कक्षा में परिभाषित) के साथ संपत्ति स्ट्रिंग तक पहुंच सकते हैं और शब्दकोश से वांछित प्रविष्टि प्राप्त करने के लिए थ्रेड संदर्भ का उपयोग कर सकते हैं। आप IOptionHandler इंटरफ़ेस को भी कार्यान्वित कर सकते हैं यदि आपके विकल्पों में अधिक शब्दकोश केवल कुंजी कुंजी शामिल है: इस तरह आप log4net कॉन्फ़िगरेशन के सक्रियण पर विकल्पों को पार्स कर सकते हैं।

+0

धन्यवाद! यही वही था जो मैं करना चाहता था। यदि कोई और दिलचस्पी लेता है तो मैं संदर्भ के लिए अपने प्रश्न लेआउटपैटर कनवर्टर को अपने प्रश्न में जोड़ दूंगा। – wageoghe

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