当我使用log4net执行此操作时,为什么会出现空的事件日志?

时间:2010-08-12 12:35:41

标签: c# log4net event-log

我有一个班级

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>

我添加到我的assemblyinfo:

[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。

4 个答案:

答案 0 :(得分:3)

我假设您有一个控制台程序(看起来您正在测试log4net)。所以我要做的第一件事就是确保日志记录与更基本的appender一起使用。配置ConsoleAppender并确保您看到日志语句。这不是必须的,但正如我所说,这就是我要做的。

更重要的是打开internal debugging,告诉你为什么没有任何内容写入事件日志。

您很可能面临权限问题。参看log4net faq

答案 1 :(得分:2)

您有权限问题。我只是拿了你的代码并用一个小调整添加了一个源我知道我的用户有写入权限(MSSQLSERVER)

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

跑你的程序,它工作正常。您需要设置要使用的sources。完成后,您需要重新启动计算机......

我暗示有些事情是错误的,有一条线说

  

log4net:EventLogAppender:源[TestApplication.vshost.exe]已注册到log []

然后我将其更改为“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>

答案 2 :(得分:0)

由于您在assemblyinfo中放置了一行,因此您不需要调用XmlConfigurator.Configure()。但是,如果您有一堆程序集,请记住一件重要的事情是包含日志调用的FIRST项目是其assemblyinfo需要该行的那个。

换句话说,如果你有一个命令行项目和一个dll项目,并且命令行项目正在执行新的Foo()但是在dll项目中定义了Foo,那么它是需要该行中的行的dll项目装配信息。但是如果你在命令行项目中添加一个日志调用,说“我要调用Foo”你的日志记录将停止工作(因为现在控制台项目是第一个进行日志调用的项目,并且配置行需要在汇编信息中!)。

对于最少的头痛来说,最安全的事情就是将这条线添加到你所获得的每个装配信息中。

答案 3 :(得分:0)

我没有看到的一件事是Log4Net.config文件是否正在复制到您的bin目录。我已经碰到了几次,它有一个简单的解决方案。

在解决方案资源管理器中,右键单击Log4Net.config文件,并确保Copy to Output Directory的字段设置为Copy AlwaysCopy if Newer(您的偏好)。在第一次设置解决方案时,我倾向于忽略这一步。

希望能帮到你。