2010-08-12 43 views
3

我有一個類當我使用log4net執行此操作時,爲什麼會收到空的事件日誌?

namespace LogToolsTest 
{ 
    public class Foo 
    { 
     private static readonly ILog logger = LogManager.GetLogger(typeof(Foo)); 

     public Foo() 
     { 

      logger.Debug("Save this text"); 
      logger.Info("Save this text"); 
      logger.Warn("Save this text"); 
      logger.Error("Save this text"); 
      logger.Fatal("Save this text"); 


      var b1 = logger.IsDebugEnabled; 
      var b2 = logger.IsInfoEnabled; 
      var b3 = logger.IsWarnEnabled; 
      var b4 = logger.IsErrorEnabled; 
      var b5 = logger.IsFatalEnabled; 
     } 
    } 
} 

我通過簡單的測試:

Foo foo = new Foo(); 

和log4net.config

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="EventLogAppender" /> 
    </root> 

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 


</log4net> 

我加入到我的集信息:

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

執行此代碼後,事件日誌中沒有條目。這是爲什麼?

現在,它的工作幾乎確定: 我刪除log4net.config,並修改了我的app.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <log4net> 
    <root> 
    <priority value="ALL" /> 
    <appender-ref ref="TraceAppender" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="FileAppender" /> 
    <appender-ref ref="EventLogAppender" /> 
    </root> 

    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
    <file value="c:\\LOGS\\SampleLog.txt" /> 
    <appendToFile value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
    </layout> 
    </appender> 
</log4net> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
</configSections> 

</configuration> 

但什麼是錯的。我在輸出中看到:

System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Unrecognized configuration section log4net. (C:\toolkit\trunk\LogToolsTest\bin\Debug\LogToolsTest.vshost.exe.config line 3) 
    at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors() 
    at System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey) 
    --- End of inner exception stack trace --- 
    at System.Configuration.ConfigurationManager.PrepareConfigSystem() 
    at System.Configuration.ConfigurationManager.GetSection(String sectionName) 
    at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName) 
    at System.Diagnostics.DiagnosticsConfiguration.GetConfigSection() 
    at System.Diagnostics.DiagnosticsConfiguration.Initialize() 
    at System.Diagnostics.DiagnosticsConfiguration.get_IndentSize() 
    at System.Diagnostics.TraceInternal.InitializeSettings() 
    at System.Diagnostics.TraceInternal.WriteLine(String message) 
    at System.Diagnostics.Trace.WriteLine(String message) 
    at log4net.Util.LogLog.EmitErrorLine(String message) 
log4net:ERROR DefaultRepositorySelector: Exception while reading ConfigurationSettings. Check your .config file is well formed XML. 
System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Unrecognized configuration section log4net. (C:\toolkit\trunk\LogToolsTest\bin\Debug\LogToolsTest.vshost.exe.config line 3) 
    at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors() 
    at System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey) 
    --- End of inner exception stack trace --- 
    at System.Configuration.ConfigurationManager.PrepareConfigSystem() 
    at System.Configuration.ConfigurationManager.GetSection(String sectionName) 
    at System.Configuration.ConfigurationManager.get_AppSettings() 
    at log4net.Util.SystemInfo.GetAppSetting(String key) 

foreach appender。

+2

當您將log4net配置放入app.config文件時,您需要在配置文件的頂部有configSections元素 – 2010-08-12 15:49:03

+0

是的!這節省了我很多時間... – 2015-10-02 15:17:37

回答

3

我假設你有一個控制檯程序(它看起來像你正在測試log4net)。所以我要做的第一件事就是確保日誌與更多基本的appender一起工作。配置一個ConsoleAppender並確保您看到日誌語句。這不是嚴格必要的,但正如我所說,這是我會做的。

更重要的是打開internal debugging,它應該告訴你爲什麼沒有寫入事件日誌。

很可能您正面臨許可問題。參看log4net faq

2

您有權限問題。我只是把你的代碼和一個小調整添加源我知道我的用戶有寫權限(MSSQLSERVER)

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    <param name="ApplicationName" value="MSSQLSERVER" /> 

然你的程序和它工作得很好。你需要設置你要使用的任何sources。一旦你完成,你將需要重新啓動您的計算機...

我暗示什麼是錯的是有一條線,說

log4net的:EventLogAppender:源[TestApplication.vshost.exe]是註冊登錄[]

然後我就把它改成了 「MSSQLSERVER」

log4net的:EventLogAppender:源[MSSQLSERVER]註冊登錄[應用]

一些有用的提示打開調試:

<log4net debug="true"> 

或者創建擁有這些設置一個app.config:),因爲

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="log4net.Internal.Debug" value="true" /> 
    </appSettings> 
    <system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
     <add 
      name="textWriterTraceListener" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="trace.txt" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 

</configuration> 
+0

仍然沒有。 EventLog沒有新條目,並且記錄器的所有參數都設置爲false – user278618 2010-08-12 12:42:42

+0

phenevo配置了log4net和一個屬性。無需調用此方法 – 2010-08-12 12:51:29

0

你不應該需要調用XmlConfigurator.Configure(你放入你的assemblyinfo中的行。但是,如果您有一堆程序集,請記住一件重要的事情,那就是包含日誌調用的FIRST項目是assemblyinfo需要該行的那個項目。

換句話說,如果你有一個命令行項目和一個dll項目,並且命令行項目正在執行新的Foo(),但是Foo是在dll項目中定義的,那就是需要該行的dll項目其組裝信息。但是,如果您在命令行項目中添加了「我將調用Foo」的日誌調用,那麼您的日誌記錄將停止工作(因爲現在控制檯項目是第一個進行日誌調用並且配置行需要在該彙編信息!)。

因此,對於最少的頭痛來說,最安全的做法就是將這條線添加到您獲得的每個組裝信息中。

+0

我刪除了XmlConfigurator.Configure()並添加了此部分,但仍然是這樣的:/ – user278618 2010-08-12 12:49:15

+0

只有在app.config文件中具有log4net配置時,才需要log4net的configSections元素。 – 2010-08-12 12:53:50

+0

對不起,錯過了。然而,我的答案的其餘部分仍然適用。 – 2010-08-12 13:01:38

0

我沒見過的一件事就是Log4Net.config文件是否複製到bin目錄。我遇到過這幾次,它有一個簡單的修復。

在您的解決方案資源管理器中,右鍵單擊Log4Net.config文件,並確保爲Copy to Output Directory的字段設置爲Copy AlwaysCopy if Newer(個人喜好)。第一次設置解決方案時,我傾向於忽視這一步驟。

希望能幫助你。

相關問題