2014-07-19 3 views
2

이상한 문제가 있습니다. 내 log4net 설정이 데이터베이스에 어떤 데이터도 로깅하지 않고 문제를 알리는 예외를 발생시키지 않습니다. "Log4net.Config"라는 별도의 파일에 구성 설정을 정의했으며 이 어셈블리에서이를 참조했습니다.log4net 데이터베이스에 로그온하지 않습니다.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

가 여기에 로그 파일입니다 (을 참고하시기 바랍니다, 나는 Log4net LIB를 통해 nuget lib에 설치).

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
     <bufferSize value="1" /> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <connectionString value="Data Source=(local);Initial Catalog=testdb;Integrated Security=True" /> 
     <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
     <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="2000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
     </parameter> 
    </appender> 
    </log4net> 
</configuration> 

내가 좋아하는 접근 해요 :

log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

System.Console.ReadLine(); 
log.Debug("This is a debug object");     
log.Error("ex", new Exception("dfdf")); 

당신이 문제를 볼 수 있습니까?

답변

7

log4net은 설계 상 예외를 발생시키지 않습니다. 이유는 로깅 구성이 잘못되어 있어도 응용 프로그램이 계속 실행되어야한다는 것입니다.

독립 log4net 구성 파일 만 log4net 구성 섹션을 포함해야하므로 log4net.config 파일이 시작 : 또한

<?xml version="1.0" standalone="yes"?> 
<log4net> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="1" /> … 

, 당신이 정의한 펜더,하지만 당신은 로거를 정의하지 않은 당신이 log4net.config이 같은 것을 추가해야하므로 :

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="AdoNetAppender" /> 
</root> 

(루트 로거 기본 로거, 당신은 최소 로그 레벨을 설정하고 펜더 당신이 사용하고자하는)

여전히 log4net.config 파일에 디버그 모드로 log4net 설정 파일을 수정 한 후 문제를 가지고 있고, 당신의 app.config (또는 Web.config의 프로젝트 유형에 따라)에 TraceListener에서 섹션을 추가하는 경우 :

<log4net debug="true"> 
     <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> … 
의 app.config에서

: 처음 상태를 log4net 때

<system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
     <add 
      name="textWriterTraceListener" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="c:\temp\log4net.txt" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 

, 그것은 지정된 파일에 디버깅 정보를 기록합니다. 로깅을 초기화하는 어셈블리 특성을 사용하고, 당신이 ight need to add a GetLogger call during your program startup을 해요 것을

참고 :

사용하여 속성이 응용 프로그램의 구성이로드 될 위치를 정의하는 명확한 방법이 될 수 있습니다. 그러나 그 속성이 순전히 수동적이라는 점을 지적하면 가치가 있습니다. 그들은 단지 정보입니다. 따라서 구성 속성을 사용하는 경우 log4net 을 호출하여 속성을 읽을 수 있도록해야합니다. LogManager.GetLogger에 대한 간단한 호출은 호출 어셈블리 의 속성을 읽고 처리하게합니다. 따라서 응용 프로그램 시작 중에 가능한 한 조기에 로깅을 수행하고 외부 어셈블리를로드하고 호출하기 전에 반드시 호를 호출해야합니다..