【问题标题】:log4net doesn't watch my app.configlog4net 不看我的 app.config
【发布时间】:2018-01-23 21:21:40
【问题描述】:

我将 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”应该启用该功能,对吗?

【问题讨论】:

    标签: log4net app-config watch appender


    【解决方案1】:

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

    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)]
    

    【讨论】:

    • 这不是没有看我的整个配置文件。只是运行时对配置文件所做的更改,没有生效。
    • 即使在调用 log4net.Config.XmlConfigurator.Configure();做出这些改变之后?
    • 很遗憾,是的。无法解释这个......你能在运行时编辑你的配置文件吗?例如转换模式,这些更改立即生效?..
    • 我认为它不会持续监视该部分,请参阅:stackoverflow.com/questions/436700/… 如果您执行它所说的刷新部分并调用 .Configure() 它可能会刷新设置。
    • 研究了这么多,你的回答救了我:)
    【解决方案2】:

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

    因为 System.Configuration API 不支持重新加载配置文件 配置设置无法使用 log4net.Config.XmlConfigurator.ConfigureAndWatch 方法。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2012-08-15
        相关资源
        最近更新 更多