c# - Log4Net 不工作,但仅适用于发布控制台构建

标签 c# console-application log4net release-builds

我有一个使用 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>

我已经尝试了 this article 中的建议( Log4Net doesn’t write log in release mode - Console Application ) 但它们似乎没有帮助。

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

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

最佳答案

the documentation for assembly configuration attributes 中所述:

Therefore if you use configuration attributes you must invoke log4net to allow it to read the attributes. A simple call to LogManager.GetLogger will cause the attributes on the calling assembly to be read and processed. Therefore it is imperative to make a logging call as early as possible during the application start-up, and certainly before any external assemblies have been loaded and invoked.

由于编译器可以更自由地重新组织发布版本中的内容,因此它似乎优化了某些内容并且没有足够快地获取程序集属性。

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

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

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

对于独立的 log4net 配置文件:

XmlConfigurator.Configure(new FileInfo(path_to_config));

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

XmlConfigurator.Configure();

关于c# - Log4Net 不工作,但仅适用于发布控制台构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367589/

相关文章:

c# - 尝试创建一个可以写入控制台或表单应用程序的方法

c# - BufferedWaveProvider 的问题

c# - 如何让 Log4Net 使用 app.config

c# - 第二个 Log4net 记录器不写入唯一文件

C#控制台应用程序无法调试,很奇怪

json - 如何在 ASP.NET 5.0 中为 log4net(或任何其他第三方库)添加配置

c# - 可见性变化动画 : property was already registered by 'FrameworkElement'

c# - DateTime.AddMonths 仅添加月份而不是日期

console-application - 您如何在 .net 核心控制台应用程序中存储用户应用程序数据

c# - 将控制台行写入文件