13

我将 log4net 配置为监视对 app.config 文件所做的更改。

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

当我运行我的应用程序并更改配置文件中的内容时,这些更改仅在我重新启动我的应用程序时生效。为什么会这样?

还有一种方法可以告诉 log4net 监视 app.config 中的更改吗?喜欢:

<appender name="FileAppender" type="log4net.Appender.FileAppender" >
    <watch value="true" />
</appender>

- - - - - - - 编辑 - - - - - - -

我现在尝试使用单独的配置文件:log4net.config。
它看起来像这样:

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="c:\log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c (line %L) -- %m%n" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="FileAppender" />
  </root>
</log4net>

在我的 assemblyInfo.cs 中,我写了以下内容:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

记录到文件的类如下所示:

ILog myLogger = LogManager.GetLogger(typeof(Form1));
myLogger.Debug("test");

这就像旧版本一样工作。生成了日志文件条目,但是当我在运行时更改 log4net.config 时,不会应用这些更改......“Watch=true”应该启用该功能,对吗?

4

3 回答 3

15

哈!,我刚刚遇到同样的问题,运行需要记录的单元测试。
添加此行修复它:

log4net.Config.XmlConfigurator.Configure();

我的 App.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingFileAppender" />
    </root>
</log4net>

我也有这个:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
于 2011-10-19T18:58:54.700 回答
10

根据log4net 文档,Watch 功能不适用于应用程序配置文件(app.config、web.config):

由于 System.Configuration API 不支持重新加载配置文件,因此无法使用 log4net.Config.XmlConfigurator.ConfigureAndWatch 方法监视配置设置。

因此,如果您需要重新配置 log4net 配置,则需要将其放在单独的 XML 文件中,并且您的应用程序需要具有足够的权限才能读取该文件:

可以使用任何接受 System.IO.FileInfo 对象的 log4net.Config.XmlConfigurator 方法指定要从中读取配置的文件。因为可以监视文件系统的文件更改通知,所以 ConfigureAndWatch 方法可用于监视配置文件的修改并自动重新配置 log4net。

于 2014-03-26T12:18:52.590 回答
0

即使我参加聚会已经非常晚了——这对我有帮助:log4net.LogManager.GetLogger("DUMMY");在我的程序开始时的一个简单的调用。我把它放在program.csMain()方法的第一行。无需将记录器分配给任何对象,只需礼貌地请求 log4net 读取程序集的属性,如此所述。

使用属性可以更清晰地定义应用程序的配置将从何处加载。然而值得注意的是,属性纯粹是被动的。它们只是信息。因此,如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。因此,必须在应用程序启动期间尽早进行日志调用,并且肯定是在加载和调用任何外部程序集之前

于 2018-01-23T13:21:40.920 回答