2

我有一个使用 log4net 的程序集。我将此程序集加载到 Windows 窗体应用程序和控制台应用程序中。它在发布和调试版本中的 Windows 窗体应用程序以及调试版本中的控制台应用程序中按预期工作,但对于控制台应用程序的发布版本神秘地失败。

我的 AssemblyInfo.cs 文件中有以下内容:

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch = true)]

在使用日志记录的类中,我包含以下成员变量声明:

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

我的 Library.dll.log4net 配置文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Library.log" />
    <appendToFile value="true" />
    <rollingStyle value="Once" />
    <maxSizeRollBackups value="5" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="INFO" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="RollingFileAppender" />
  </root>
</log4net>

我已经尝试过本文中的建议(Log4Net 不会在发布模式下写入日志 - 控制台应用程序),但它们似乎没有帮助。

我还尝试在程序集中(在引用的第一个对象的构造函数中)以编程方式尽快打开内部调试,但这也没有效果。

还有其他想法吗?谁能发现我做错了什么?

4

1 回答 1

7

正如它在程序集配置属性的文档中所述:

因此,如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。因此,必须在应用程序启动期间尽早进行日志调用,并且肯定是在加载和调用任何外部程序集之前。

由于编译器可以更自由地在 Release 构建中重新组织事物,它似乎可能已经优化了某些东西,并且程序集属性没有被足够快地采用。

如果是这种情况,启动程序中的简单显式日志调用将强制 log4net 加载配置:

LogManager.GetLogger("Startup").Debug("This logging call loads the configuration");

但是,这仍然可能存在问题,例如对于某些 Web 应用程序,或者如果(如注释)启动应用程序不引用 log4net:在这些情况下,您必须使用对配置系统的显式调用而不是程序集属性。它只需要调用一次。

对于独立的 log4net 配置文件:

XmlConfigurator.Configure(new FileInfo(path_to_config));

对于 web.config 或 app.config 中的 configSection 中的配置

XmlConfigurator.Configure();
于 2016-04-02T13:25:53.950 回答