来自程序集属性的Log4net配置不会加载配置文件 [英] Log4net configuration from assembly attribute does not load configuration file

查看:104
本文介绍了来自程序集属性的Log4net配置不会加载配置文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have the following file Log4net.config in my bin directory:

<?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文件中的以下代码:

And the following code in my AssemblyInfo.cs file:

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调试输出:

When I run the program, I get the following log4net debug output:

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中注释掉该属性并在程序初始化期间运行以下代码时,它可以按预期工作:

Log4net loads, but doesn't seem to be processing my config file. When I comment out the attribute in AssemblyInfo.cs and run the following code during my program initialization, it works as expected:

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

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

What am I doing wrong? I want to load from AssemblyInfo.cs.

推荐答案

我也无法使用这种增强log4net的方法. 文档说,您必须在自己的很早就拨打电话应用程序启动

I also have trouble with this method of boostrapping log4net. The documentation says you have to make a call very early in your application startup

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

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

Try placing a logger in the same class that starts your application (program.cs, app.xaml, whatever). For example

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

对于踢,请对日志进行任何调用(即使是从附加过程中筛选或评估的日志,也应强制log4net评估您的存储库/层次结构).

And for kicks, make any call to the log (even one that is filtered or evaluated out of the append process, it should force log4net to evaluate your repository/heirarchy).

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

这篇关于来自程序集属性的Log4net配置不会加载配置文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆