【问题标题】:Why do I get an empty eventlog when I do this with log4net?当我使用 log4net 执行此操作时,为什么会得到一个空的事件日志?
【发布时间】:2010-08-12 12:35:40
【问题描述】:

我有课

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 附加程序。

【问题讨论】:

  • 当你把 log4net 配置放到 app.config 文件中时,你需要在配置文件的顶部有 configSections 元素
  • 是的!这为我节省了很多时间...

标签: c# log4net event-log


【解决方案1】:

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

要做的更重要的事情是打开internal debugging,它应该会告诉你为什么什么都没有写入事件日志。

您很可能面临权限问题。参照。 log4netfaq.

【讨论】:

    【解决方案2】:

    您遇到了权限问题。我刚刚获取了您的代码,并通过一个小调整添加了一个我知道我的用户对 (MSSQLSERVER) 具有写入权限的源

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

    运行您的程序,它运行良好。您需要设置您要使用的任何sources。完成后,您需要重新启动计算机...

    我暗示出了点问题是有一行说

    log4net: EventLogAppender: Source [TestApplication.vshost.exe] 被注册到日志[]

    然后我将其更改为“MSSQLSERVER”

    log4net: EventLogAppender: 源 [MSSQLSERVER] 已注册到日志 [Application]

    一些有用的提示开启调试:

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

    【讨论】:

    • 还是什么都没有。 EventLog 没有新条目,logger 的所有参数都设置为 false
    • phenevo 为 log4net 配置了一个属性。无需调用此方法
    【解决方案3】:

    您不需要调用 XmlConfigurator.Configure() ,因为您在 assemblyinfo 中输入了一行。但是,如果您有一堆程序集,需要记住的重要一点是,包含日志调用的第一个项目是其 assemblyinfo 需要该行的项目。

    也就是说,如果你有一个命令行项目和一个dll项目,并且命令行项目在做new Foo()但是在dll项目中定义了Foo,那么需要在其装配信息。但是,如果您随后在命令行项目中添加一个日志调用,显示“我即将调用 Foo”,您的日志记录将停止工作(因为现在控制台项目是第一个进行日志调用的项目,并且配置行需要要在该程序集信息中!)。

    因此,最安全的方法是在您拥有的每个装配信息中添加该行。

    【讨论】:

    • 我删除了 XmlConfigurator.Configure() 并添加了这一部分,但还是一样:/
    • 只有在 app.config 文件中有 log4net 配置时才需要 log4net 的 configSections 元素。
    • 抱歉,错过了。但是我的其余答案仍然适用。
    【解决方案4】:

    我没有看到提到的一件事是 Log4Net.config 文件是否正在复制到您的 bin 目录。我遇到过几次,它很容易解决。

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

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多