Log4Net 不工作,但仅适用于发布控制台构建
Log4Net not working, but only for release console 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");
但是,这仍然会存在问题,例如对于某些 Web 应用程序,或者如果(如评论中所述)启动应用程序未引用 log4net:在这些情况下,您必须使用对配置系统的显式调用而不是程序集属性。只需调用一次。
对于独立的 log4net 配置文件:
XmlConfigurator.Configure(new FileInfo(path_to_config));
对于 web.config 或 app.config
中的 configSection 中的配置
XmlConfigurator.Configure();
我有一个使用 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");
但是,这仍然会存在问题,例如对于某些 Web 应用程序,或者如果(如评论中所述)启动应用程序未引用 log4net:在这些情况下,您必须使用对配置系统的显式调用而不是程序集属性。只需调用一次。
对于独立的 log4net 配置文件:
XmlConfigurator.Configure(new FileInfo(path_to_config));
对于 web.config 或 app.config
中的 configSection 中的配置XmlConfigurator.Configure();