2009-04-10 9 views
14

पुन: कॉन्फ़िगर करें मैं अपने ASP.NET ऐप्स में Log4Net लॉगिंग स्तर को गतिशील रूप से पुन: कॉन्फ़िगर करने के सर्वोत्तम तरीके पर युक्तियों की तलाश में हूं। मैं आमतौर पर एक साधारण विन्यास का उपयोग करता हूं जहां रूट लॉगर डिफ़ॉल्ट लॉगिंग स्तर को परिभाषित करता है, उदा।गतिशील रूप से लॉग 4Net

<log4net> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="..." /> 
    <appender-ref ref="..." /> 
    ... etc ...  
    </root> 
    ... etc 

और कई परिशिष्ट हो सकते हैं, प्रत्येक फ़िल्टर के साथ लॉगिंग स्तर को परिभाषित करने के लिए।

  1. पहली बात मैं ऐसा करने में सक्षम होना चाहते हैं व्यवस्थापकों एक व्यवस्थापक पृष्ठ है कि उन्हें (क) जड़ लकड़हारा और के लिए वर्तमान स्तर को देखने के लिए सक्षम बनाता है (ख) गतिशील रूप से कनेक्ट करने की अनुमति के लिए होगा बदल दें। मैं "कॉन्फ़िगर एंडवॉच" का उपयोग नहीं करना चाहता हूं और डिस्क पर कॉन्फ़िगरेशन फ़ाइल को लिखना चाहता हूं क्योंकि मैं नहीं चाहता कि एप्लिकेशन को पुनर्नवीनीकरण के दौरान इन परिवर्तनों को जारी रखा जाए।

  2. अगला मैं आगे जाना चाहता हूं, और एक व्यवस्थापक पृष्ठ पर सभी मौजूदा लॉगर्स के साथ ट्री व्यू प्रदर्शित करने में सक्षम होना चाहिए जो उनके अनुप्रयोग में मौजूद हैं, और उनके वर्तमान लॉगिंग स्तर। और व्यवस्थापक को पदानुक्रम के किसी भी स्तर पर चुनिंदा स्तर को चुनने में सक्षम होने की अनुमति दें।

विचार एक सामान्य व्यवस्थापक पृष्ठ है कि मैं अपने सभी क्षुधा प्रशासकों चुनिंदा समस्याएं दूर करने के लिए गतिशील रूप से डीबग स्तरीय लॉगिंग सक्षम करने की अनुमति देता है कि में डाल सकते हैं बनाने के लिए है।

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

अद्यतन:

दोनों जवाब समान रूप से अच्छे हैं, इसलिए मैं पहली बार स्वीकार कर लिया है - धन्यवाद। काट-छांट कर लिए, मैं सभी मौजूदा वालों के रूप में निम्नानुसार प्राप्त कर सकते हैं:

foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers()) 
{ 
    log4net.Repository.Hierarchy.Logger logger = 
     (log4net.Repository.Hierarchy.Logger)log.Logger; 
    Debug.WriteLine(
     String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>", 
     logger.Name, 
     logger.Parent.Name, 
     logger.Level == null ? "<null>" : logger.Level.Name, 
     logger.EffectiveLevel 
     ) 
     ); 
} 
  • EffectiveLevel प्रभावी स्तर है - अगर बाद रिक्त नहीं है स्तर के रूप में ही है, अन्यथा माता पिता से विरासत में मिला।

  • ऊपर लौटाए गए लॉगजर में से कम से कम एक में मूल लॉगर के रूप में रूट लॉगर होगा, जो मुझे रूट लॉगर का संदर्भ प्राप्त करने में सक्षम बनाता है।

ऊपर के साथ लॉगर पदानुक्रम का पुनर्निर्माण करना संभव होना चाहिए। फिर

अद्यतन 2

धन्यवाद। मैंने एक एएसपी.NET सर्वर नियंत्रण लागू किया है जो एक वृक्ष दृश्य में लॉगर व्यूअर को चेकबॉक्स के साथ प्रदर्शित करता है, और उपयोगकर्ता को पदानुक्रम में किसी भी नोड पर लॉगिंग स्तर को गतिशील रूप से बदलने की अनुमति देता है। बहुत अच्छा काम करता है और मैं इसे अपने सभी एएसपी.नेट वेब और वेब सेवा ऐप्स में एडमिन पेज पर डाल दूंगा!

उत्तर

8

आप इस (अपरीक्षित कोड) की तरह कुछ के लिए देख रहे हैं:

foreach (ILog logger in log4net.LogManager.GetCurrentLoggers()) 
{ 
    ((log4net.Repository.Hierarchy.Logger)logger).Level = 
     log4net.Core.Level.Error; 
} 

आप स्पष्ट रूप से लकड़हारा नाम बाहर खींच सकता है एक ही तरीके से आदि,।

+0

मैं ऊपर कोड परीक्षण किया और पाया कि मैं खजाने के सभी के माध्यम से लूप करने के लिए आवश्यक है और डबल प्रकार की जाँच करें। foreach (LogManager.GetAllRepositories में वर रेपो()) foreach (। Repo.GetCurrentLoggers में वर लकड़हारा() OfType ()) logger.Level = स्तर; –

+0

एफवाईआई: डायनामिक लॉग 4नेट कॉन्फ़िगरेशन एपीआई का उपयोग करते समय मैं एक बार समवर्ती मुद्दों में भाग गया - यह थ्रेड सुरक्षित प्रतीत नहीं होता है। – galaktor

+0

लॉग 4नेट का कौन सा संस्करण था? मुझे आईएलओजी के किसी भी कार्यान्वयन को नहीं देख रहा है जो रेपोजिटरी में जा सकता है। हाइरार्की। लॉगर –

3

मैंने सफलतापूर्वक प्रोग्रामेटिक रूप से लॉग 4नेट लॉगर के लॉगिंग स्तर को बदल दिया है, लेकिन यह स्पष्ट नहीं है कि सार्वजनिक एपीआई से ऐसा कैसे किया जाए। इस लॉगर को देखते हुए:

private readonly log4net.ILog mylogger; 

आप डीबग करने के लिए यह निर्धारित करने के लिए निम्नलिखित फैंसी फुटवर्क क्या करना है:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = 
log4net.Core.Level.Debug; 

कुछ स्थितियों के लिए - मैं क्या यह और अधिक जटिल आवश्यकता का कारण बनता है पता नहीं है - आपको आलेख log4net and changing the logger levels में दिखाए गए अतिरिक्त चरणों का पालन करने की आवश्यकता हो सकती है।

2

काफी नहीं वास्तव में आप क्या चाहते हो सकता है, फिर भी:

using System; 
using System.Collections.Generic; 
using System.Text; 
using log4net; 
using log4net.Config; 
using NUnit.Framework; 

namespace ExampleConsoleApplication 
{ 
    enum DebugLevel : int 
    { 
    Fatal_Msgs = 0 , 
    Fatal_Error_Msgs = 1 , 
    Fatal_Error_Warn_Msgs = 2 , 
    Fatal_Error_Warn_Info_Msgs = 3 , 
    Fatal_Error_Warn_Info_Debug_Msgs = 4 
    } 


    class TestClass 
    { 

     private static readonly ILog logger = 
       LogManager.GetLogger (typeof (TestClass)); 


     static void Main (string[] args) 
     { 
     TestClass objTestClass = new TestClass(); 

      Console.WriteLine (" START "); 

     int shouldLog = 4; //CHANGE THIS FROM 0 TO 4 integer to check the functionality of the example 
     //0 -- prints only FATAL messages 
     //1 -- prints FATAL and ERROR messages 
     //2 -- prints FATAL , ERROR and WARN messages 
     //3 -- prints FATAL , ERROR , WARN and INFO messages 
     //4 -- prints FATAL , ERROR , WARN , INFO and DEBUG messages 

     string srtLogLevel = String.Empty ; 
     switch (shouldLog) 
     { 
     case (int)DebugLevel.Fatal_Msgs : 
      srtLogLevel = "FATAL"; 
      break; 
     case (int)DebugLevel.Fatal_Error_Msgs: 
      srtLogLevel = "ERROR"; 
      break; 
     case (int)DebugLevel.Fatal_Error_Warn_Msgs : 
      srtLogLevel = "WARN"; 
      break; 
     case (int)DebugLevel.Fatal_Error_Warn_Info_Msgs : 
      srtLogLevel = "INFO"; 
      break; 
     case (int)DebugLevel.Fatal_Error_Warn_Info_Debug_Msgs : 
      srtLogLevel = "DEBUG" ; 
      break ; 
     default: 
      srtLogLevel = "FATAL"; 
      break; 
     } 

     objTestClass.SetLogingLevel (srtLogLevel); 


     objTestClass.LogSomething(); 


      Console.WriteLine (" END HIT A KEY TO EXIT "); 
      Console.ReadLine(); 
      } //eof method 

    /// <summary> 
    /// Activates debug level 
    /// </summary> 
    /// <sourceurl>http://geekswithblogs.net/rakker/archive/2007/08/22/114900.aspx</sourceurl> 
    private void SetLogingLevel (string strLogLevel) 
    { 
    string strChecker = "WARN_INFO_DEBUG_ERROR_FATAL" ; 

     if (String.IsNullOrEmpty (strLogLevel) == true || strChecker.Contains (strLogLevel) == false) 
     throw new Exception (" The strLogLevel should be set to WARN , INFO , DEBUG ,"); 



     log4net.Repository.ILoggerRepository[] repositories = log4net.LogManager.GetAllRepositories(); 

     //Configure all loggers to be at the debug level. 
     foreach (log4net.Repository.ILoggerRepository repository in repositories) 
     { 
     repository.Threshold = repository.LevelMap[ strLogLevel ]; 
     log4net.Repository.Hierarchy.Hierarchy hier = (log4net.Repository.Hierarchy.Hierarchy)repository; 
     log4net.Core.ILogger[] loggers = hier.GetCurrentLoggers(); 
     foreach (log4net.Core.ILogger logger in loggers) 
     { 
      ((log4net.Repository.Hierarchy.Logger)logger).Level = hier.LevelMap[ strLogLevel ]; 
     } 
     } 

     //Configure the root logger. 
     log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository(); 
     log4net.Repository.Hierarchy.Logger rootLogger = h.Root; 
     rootLogger.Level = h.LevelMap[ strLogLevel ]; 
    } 

    private void LogSomething() 
    { 
     #region LoggerUsage 
     DOMConfigurator.Configure(); //tis configures the logger 
     logger.Debug ("Here is a debug log."); 
     logger.Info ("... and an Info log."); 
     logger.Warn ("... and a warning."); 
     logger.Error ("... and an error."); 
     logger.Fatal ("... and a fatal error."); 
     #endregion LoggerUsage 

    } 
    } //eof class 

} //eof namespace 






#region TheAppConfig 
/* 
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" 
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
      <param name="File" value="LogTest2.txt" /> 
      <param name="AppendToFile" value="true" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <param name="Header" value="[Header] \r\n" /> 
       <param name="Footer" value="[Footer] \r\n" /> 
       <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" /> 
      </layout> 
     </appender> 

     <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
      <mapping> 
       <level value="ERROR" /> 
       <foreColor value="White" /> 
       <backColor value="Red, HighIntensity" /> 
      </mapping> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
      </layout> 
     </appender> 


     <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
      <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" /> 
      <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> 

      <parameter> 
       <parameterName value="@log_date" /> 
       <dbType value="DateTime" /> 
       <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@thread" /> 
       <dbType value="String" /> 
       <size value="255" /> 
       <layout type="log4net.Layout.PatternLayout" value="%thread" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@log_level" /> 
       <dbType value="String" /> 
       <size value="50" /> 
       <layout type="log4net.Layout.PatternLayout" value="%level" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@logger" /> 
       <dbType value="String" /> 
       <size value="255" /> 
       <layout type="log4net.Layout.PatternLayout" value="%logger" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@message" /> 
       <dbType value="String" /> 
       <size value="4000" /> 
       <layout type="log4net.Layout.PatternLayout" value="%messag2e" /> 
      </parameter> 
     </appender> 
     <root> 
      <level value="INFO" /> 
      <appender-ref ref="LogFileAppender" /> 
      <appender-ref ref="AdoNetAppender" /> 
      <appender-ref ref="ColoredConsoleAppender" /> 
     </root> 
    </log4net> 
</configuration> 
*/ 
#endregion TheAppconfig 

//this is the xml added replace here your log4net and Nunit paths 
//<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"> 
     // <SpecificVersion>False</SpecificVersion> 
     // <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath> 
     //</Reference> 
     //<Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" /> 
संबंधित मुद्दे