2010-06-08 19 views
5

काम नहीं कर रहे हैं मैं एक कस्टम log4net लॉगर/logmanager को लागू करने की कोशिश कर रहा हूं ताकि मैं एक नया स्तर जोड़ सकूं। मैं कुछ वैकल्पिक फ़ील्ड रखने के लिए लक्ष्य तालिका (मैं एक AdoNetAppender और SQL Server 2008 का उपयोग कर रहा हूं) की स्कीमा भी चाहता हूं; उदाहरण के लिए, जो स्तर मैं जोड़ रहा हूं उसका उपयोग ट्रैक को ट्रैक करने के लिए किया जाता है, और फ़ील्ड में से एक को अवधि होने की आवश्यकता होती है (हमें यह बताने के लिए कि कितनी देर लगती है)। हालांकि, अन्य स्तर (INFO, DEBUG, FATAL, आदि) के पास अवधि के लिए कोई मूल्य नहीं होगा। इसलिए मुझे तालिका में सम्मिलित करने में सक्षम होना चाहिए, जिसमें सभी फ़ील्ड मूल्य नहीं हैं - अधिमानतः अप्रासंगिक फ़ील्ड के लिए शून्य मान पास करने के लिए लॉग इन करने वाले सभी मानक स्तरों को पुन: कार्यान्वित किए बिना। आदर्श रूप से, log4net स्वचालित रूप से संपत्ति मूल्यों के लिए NULL पास करेगा जो इसे किसी विशेष लॉगिंग ईवेंट के लिए नहीं मिल सकता है।log4net कस्टम गुण

अपने कस्टम लकड़हारा में कोड इस प्रकार है:

public void Usage(TimeSpan? duration, DateTime? startTime, DateTime? endTime, string message) 
    { 
     if (IsUsageEnabled) 
     { 
      LoggingEvent loggingEvent = new LoggingEvent(GetType(), Logger.Repository, Logger.Name, _currentUsageLevel, 
       message, null); 
      if (startTime.HasValue) 
      { 
       loggingEvent.Properties["StartTime"] = startTime.Value; 
      } 
      else 
      { 
       loggingEvent.Properties["StartTime"] = DBNull.Value; 
      } 

      if (endTime.HasValue) 
      { 
       loggingEvent.Properties["EndTime"] = endTime.Value; 
      } 
      else 
      { 
       loggingEvent.Properties["EndTime"] = DBNull.Value; 
      } 

      if (duration.HasValue) 
      { 
       loggingEvent.Properties["Duration"] = duration.Value.TotalMilliseconds; 
      } 
      else 
      { 
       loggingEvent.Properties["Duration"] = DBNull.Value; 
      } 

      Logger.Log(loggingEvent); 
     } 
    } 

(DBNull.Value के लिए असाइनमेंट उम्मीद में कि कि log4net पास nulls में मदद मिलेगी जब मूल्य पारित नहीं किया गया था में जोड़ा गया था, लेकिन मुझे आशा है कि वे हटाया जा सकता है)। यह तभी काम करता है मैं अवधि, StartTime और endtime में पारित

<appender name="SQLAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="1" /> 
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    <connectionString value="my connection string (which actually gets replaced at runtime with a connection string retrieved from a config database)" /> 
    <commandText value="INSERT INTO MyTable ([Date],[Thread],[Level],[Logger],[Message],[Exception], [Login], [StartTime], [EndTime], [Duration]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @login, @start_time, @end_time, @duration)" /> 
    <parameter> 
    <parameterName value="@log_date" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.RawTimeStampLayout" /> 
    </parameter> 
    <parameter> 
    <parameterName value="@thread" /> 
    <dbType value="String" /> 
    <size value="255" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%thread" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@log_level" /> 
    <dbType value="String" /> 
    <size value="50" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@logger" /> 
    <dbType value="String" /> 
    <size value="255" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%logger" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@message" /> 
    <dbType value="String" /> 
    <size value="4000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%message" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@exception" /> 
    <dbType value="String" /> 
    <size value="4000" /> 
    <layout type="log4net.Layout.ExceptionLayout" /> 
    </parameter> 
    <parameter> 
    <parameterName value="@login" /> 
    <dbType value="String" /> 
    <size value="255" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{CurrentLogin}" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value="@start_time" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.PatternLayout" 
     value="%property{StartTime}" /> 
    </parameter> 
    <parameter> 
    <parameterName value="@end_time" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{EndTime}" /> 
    </layout> 
    </parameter><parameter> 
    <parameterName value="@duration" /> 
    <dbType value="Double" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%property{Duration}" /> 
    </layout> 
    </parameter> 
</appender> 

जब मैं अपने कस्टम स्तर के साथ कुछ प्रवेश करने का प्रयास,:

appender config इस प्रकार है। किसी और चीज के लिए - डिफ़ॉल्ट स्तरों सहित - यह आउटपुट विंडो में कोई सुराग नहीं होने के साथ चुपचाप विफल रहता है (हालांकि डिफ़ॉल्ट स्तरों के साथ लॉगिंग अपवादों को फेंकता है कि यह स्ट्रिंग को डेटटाइम या डबल में परिवर्तित नहीं कर सकता है)।

कोई कारण यह है कि कोई भी कारण देख सकता है कि यह इस तरह चुपचाप क्यों विफल होगा?

उत्तर

7

मैंने अंततः कुछ log4net स्रोत के माध्यम से पता लगाने के बाद इसे समझ लिया। समस्या यह थी कि मैं कस्टम पैरामीटर को प्रस्तुत करने के लिए PatternLayout का उपयोग कर रहा था। यह लेआउट null स्ट्रिंग "(null)" पर coerces, जो तालिका में एक शून्य datetime फ़ील्ड में डालने का प्रयास कर रहा है, जो समस्याएं उत्पन्न करता है। समाधान सरल है: PatternLayout लेआउट का उपयोग करने के बजाय, log4net.Layout.RawPropertyLayout का उपयोग करें। यह एक शून्य संपत्ति को null के रूप में पास करेगा, जो आप चाहते हैं।

+0

को इसका उपयोग इस तरह करना था: नया RawPropertyLayout {Key = propertyName} – xhafan

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