2012-08-03 20 views
12

का उपयोग करते समय स्तर 'वर्बोज़' के साथ संदेशों को लॉग करता है। मेरे पास एक एज़ूर वर्कर भूमिका है जिसे मैंने लॉगऑनेट ट्रेस एपेंडर का उपयोग करने के लिए कॉन्फ़िगर किया है जो WindowsAzure.Diagnostics को लिखता है। यह कार्यकर्ता भूमिका के RoleEntryPoint में निम्नलिखित कॉल करके किया जाता है।लॉग 4नेट ट्रेसएपेंडर केवल विंडोज़ एज़ूर डायग्नोस्टिक्स मॉनिटर

using System; 
using Microsoft.WindowsAzure.Diagnostics; 
using log4net.Config; 

namespace XXX 
{ 
    public class WorkerRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      var config = DiagnosticMonitor.GetDefaultInitialConfiguration(); 

      config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Warning; 
      config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5); 

      config.WindowsEventLog.DataSources.Add("System!*"); 
      config.WindowsEventLog.DataSources.Add("Application!*"); 
      config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Error; 
      config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(5); 

      DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config); 

     XmlConfigurator.Configure(); 
     } 
    } 
} 

App.config फ़ाइल निम्नलिखित तरीके से कॉन्फ़िगर किया गया है:

<log4net> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%logger - %message" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="TraceAppender" /> 
    </root> 
</log4net> 

<system.diagnostics> 
    <trace> 
     <listeners> 
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> 
       <filter type="" /> 
      </add> 
     </listeners> 
    </trace> 
</system.diagnostics> 

इसी का परिणाम है कि सभी संदेश (यहां तक ​​कि त्रुटियों) "वर्बोज़" स्तर के रूप में तालिका भंडारण में लॉग इन कर रहे हैं।

इसे कैसे ठीक करें?

+0

यह अब पुराना है। उदाहरण के लिए http://blog.kloud.com.au/2014/10/22/logging-with-log4net-and-azure-diagnostics-on-web-and-worker-roles/ देखें। – Rory

+0

क्या आप निश्चित हैं? लोग अभी भी माइक्रोसॉफ्ट के साथ इस समस्या का सामना कर रहे हैं। WindowsAzure.Diagnostics 2.5.0.0 –

+0

हमम:/नहीं मुझे यकीन नहीं है। – Rory

उत्तर

21

ब्लॉग पोस्ट के एक जोड़े को इस मुद्दे से निपटने के: (here और here)

  • ऐसा लगता है कि log4net TraceAppender संदेशों Trace.Write करने के लिए सभी लॉग संदेशों धर्मान्तरित और DiagnosticMonitorTraceListener सभी ट्रेस धर्मान्तरित कि Verbose करने के लिए संदेश लिखें।

    using System.Diagnostics; 
    using log4net.Appender; 
    using log4net.Core; 
    namespace XXX.Logging 
    { 
        public class AzureTraceAppender : TraceAppender 
        { 
         protected override void Append(LoggingEvent loggingEvent) 
         { 
          var level = loggingEvent.Level; 
          var message = RenderLoggingEvent(loggingEvent); 
    
          if (level >= Level.Error) 
           Trace.TraceError(message); 
          else if (level >= Level.Warn) 
           Trace.TraceWarning(message); 
          else if (level >= Level.Info) 
           Trace.TraceInformation(message); 
          else 
           Trace.WriteLine(message); 
          if (ImmediateFlush) 
           Trace.Flush(); 
         } 
        } 
    } 
    

    इस विस्तार तो मेरे App.config में लागू किया गया था:

    <log4net> 
        <appender name="AzureTraceAppender" type="XXX.Logging.AzureTraceAppender"> 
         <layout type="log4net.Layout.PatternLayout"> 
          <conversionPattern value="%logger - %message" /> 
         </layout> 
        </appender> 
        <root> 
         <level value="ALL" /> 
         <appender-ref ref="AzureTraceAppender" /> 
        </root> 
    </log4net> 
    

मेरे मामले में जवाब पीट McEvoy के समाधान का उपयोग करें और निम्नलिखित तरीके से TraceAppender विस्तार करने के लिए था

+1

बहुत उपयोगी। हालांकि, मुझे 'Trace.Write()' के माध्यम से log4net से डीबग स्तर संदेश नहीं मिल रहे थे। मैंने कोड को अन्यथा (स्तर> = स्तर। डीबग) 'में समायोजित किया है और अब मेरे स्ट्रीमिंग लॉग और टेबल स्टोरेज में डीबग स्तर संदेश देख रहा हूं। –

+1

हां यह बहुत उपयोगी था। एक टिप्पणी: एक साधारण Trace.Write (..) Azure स्ट्रीमिंग लॉग में नहीं दिखाया जाएगा, इसलिए अंतिम और शाखा कुछ भी नहीं करता है। हमें ट्रेस के 3 स्तरों को स्पष्ट रूप से लॉग 4नेट संदेशों के 5 स्तरों को प्रोजेक्ट करना होगा। –

+0

यह चाल है! –