程序集属性中的 Log4net 配置不加载配置文件

标签 log4net log4net-configuration

我的 bin 目录中有以下文件 Log4net.config:

<?xml version="1.0" encoding="utf-8" ?>
<log4net xmlns="urn:log4net">
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <param name="file" value="MyLogFile.log"/>
        <param name="appendToFile" value="false"/>
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ConsoleAppender"/>
    </root>
    <logger name="NHibernate" additivity="false">
        <level value="WARN"/>
    </logger>
</log4net>

以及我的 AssemblyInfo.cs 文件中的以下代码:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyTitle("My Project")]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]

当我运行该程序时,我得到以下 log4net 调试输出:

log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [D:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\log4net.dll]. (.NET Runtime [4.0.30319.1] on Microsoft Windows NT 6.1.7600.0)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] Loaded From [D:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\MyCompany.Framework.dll]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
The thread 'vshost.RunParkingWindow' (0xd30) has exited with code 0 (0x0).
The thread '<No Name>' (0x15d0) has exited with code 0 (0x0).
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]

Log4net 加载,但似乎没有处理我的配置文件。当我注释掉 AssemblyInfo.cs 中的属性并在我的程序初始化期间运行以下代码时,它按预期工作:

var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);

我做错了什么?我想从 AssemblyInfo.cs 加载。

最佳答案

我对这种引导 log4net 的方法也有问题。 documentation说你必须在你的应用程序启动的早期就打电话

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.

尝试将记录器放在启动您的应用程序(program.cs、app.xaml 等)的同一个类中。例如

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

为了好玩,对日志进行任何调用(即使是在附加过程中被过滤或评估的调用,它也应该强制 log4net 评估您的存储库/层次结构)。

static Program()
{
    Log.Debug("Application loaded.");
}

关于程序集属性中的 Log4net 配置不加载配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204529/

相关文章:

java - 如何使用 log4j SMTP 附加程序发送电子邮件

.net - 如何让 log4net 只保留最后 X 天的日志?

.net - 使用 log4Net 在单个进程中记录多个客户端的帮助

Log4Net:什么时候获取和释放文件句柄?

c# - 如何防止 Log4Net 截断异常?

c# - C#使用log4net出错时发送邮件

c# - ILog 还是 ILogger?

log4net - 如何使用 Ninject 启用日志记录?

c# - 未创建日志文件?

log4net,这个配置怎么了