问题描述
我一直在努力寻找重复的内容,但无论看起来多么基本,我都必须提出以下问题,以便一劳永逸地弄清楚!
I've looked hard for duplicates but have to ask the following, no matter how basic it may seem, to get it clear once and for all!
在 64 位 W7 上的 VS28KSP1 上使用 log4net 版本 1.2.10.0 的全新控制台应用程序中,我有以下代码:-
In a fresh Console app using log4net version 1.2.10.0 on VS28KSP1 on 64 bit W7, I have the following code:-
using log4net;
using log4net.Config;
namespace ConsoleApplication1
{
class Program
{
static readonly ILog _log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
_log.Info("Ran");
}
}
}
在我的 app.config
中,我有:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Program.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
这不会写任何东西,除非我添加一个属性:
This doesnt write anything, unless I either add an attribute:
[ assembly:XmlConfigurator ]
或者在Main()中显式初始化:
Or explicitly initialise it in Main():
_log.Info("This will not go to the log");
XmlConfigurator.Configure();
_log.Info("Ran");
这引发了以下问题:
- 我几乎可以肯定我已经在某个版本的 log4net 上看到它在没有添加程序集属性或在 Main 中调用的情况下工作.有人可以向我保证,我不会这么想吗?
- 谁能指出我在文档中明确指出需要配置部分和初始化挂钩的位置 - 希望能说明何时更改,如果更改了?
我可以很容易地想象为什么这可能是政策 - 明确初始化步骤以避免意外等,只是我似乎记得并非总是如此......(通常我有配置一个单独的文件,通常会从图片中删除配置部分)
I can easily imagine why this might be the policy -- having the initialisation step explicit to avoid surprises etc., it's just that I seem to recall this not always being the case... (And normally I have the config in a separate file, which generally takes configsections out of the picture)
推荐答案
根据手册中的配置页面:
log4net 配置可以使用程序集级属性进行配置,而不是通过编程方式指定.
The log4net configuration can be configured using assembly-level attributes rather than specified programmatically.
XmlConfiguratorAttribute:log4net.Config.XmlConfiguratorAttribute
允许使用以下属性配置 XmlConfigurator
:
XmlConfiguratorAttribute: The log4net.Config.XmlConfiguratorAttribute
Allows the XmlConfigurator
to be configured using the following properties:
- 配置文件 ...
- ConfigFileExtension ...
如果未指定 ConfigFile 或 ConfigFileExtension 属性,则应用程序配置文件(例如 TestApp.exe.config)将用作 log4net 配置文件.
If neither of the ConfigFile or ConfigFileExtension properties are specified, the application configuration file (e.g. TestApp.exe.config) will be used as the log4net configuration file.
示例用法:
// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.
我同意这有点模棱两可,但我将示例用法的存在解释为 log4net 不会使用没有上述属性的 .config 文件;并且他们指出您必须使用这两个属性之一,但不要说完全省略该属性的事实,这向我表明该属性(或编程调用)是使用 app.config 所必需的你想要的方式.
I agree that it's a bit ambiguous, but I interpret the existence of the example usage to mean that log4net will not use the .config file without the above attribute; and the fact that they point out that you have to use one of the two properties, but do not say anything about leaving out the attribute altogether, suggests to me that the attribute (or programmatic call) is required to use app.config in the way you want.
这篇关于log4net 初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!