【问题标题】:How to change the Logging Level of a service using the log4net.config file ?如何使用 log4net.config 文件更改服务的日志记录级别?
【发布时间】:2018-07-17 23:36:55
【问题描述】:

我知道还有其他几个类似的问题和答案,但它们在我的场景中不起作用。

我的应用程序在我作为参数提供的文件夹中获取 log4net.config 文件的路径。一旦获得了确切的路径。我这样初始化我的 XmlConfigurator:

 XmlConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));

然后,我使用以下代码接收当前的日志记录级别

string currentLevel = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level.ToString();

从该文件中为我检索正确的当前日志级别(我这样做是为了检查配置器是否链接到该文件并正常工作)。

我从上一行代码中检索的值正是我需要更改的级别。为此,我使用以下代码作为其他类似问题的解决方案:

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = newLevel;
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty);

其中 newLevel 是存储我想要更改的级别的变量,例如

newLevel = Level.Fatal;

经过大量调试,我意识到如果我在前面的代码使用相同的代码之后再次接收到当前级别

string currentLevel = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level.ToString();

再次声明,它确实给了我新设置的日志记录级别的值。

但是,由于某些原因,当我在文本编辑器中打开并查看实际配置文件时,并没有对其进行任何更改。此外,一旦我重新启动我的应用程序,或者如果我在检查新设置的日志级别之前编写另一个 XmlConfigurator.ConfigureAndWatch 语句(与之前完全相同),日志级别将显示为好像它没有更改。

请帮我解决我的问题。非常感谢。

【问题讨论】:

  • 据我所知,log4net 不会将配置更改存储到配置文件中。这是因为该文件可以在(只读)程序文件目录等中。它只从这样的文件中配置自己。如果要更改文件,请使用已知的 .NET XML 读取器和写入器类。
  • @KBO 使用 .net xml 读取器和写入器类允许我在运行时更改“服务”的日志级别,还是必须重新启动服务才能使更改生效?我更喜欢 '.raiseConfigurationChanged' 解决方案,因为我阅读它允许我在应用程序运行时更改日志级别。
  • 您的应用程序/服务不应该关心输出日志级别,除了 log4net 类型中可用的(只读)之外。您的应用程序只是记录,决定当时每个事件的级别。应用外部的人员/操作 - 例如管理员、调试问题的人等 - 决定输出日志级别(当然,应用程序的开发人员通常会设置默认/初始级别)。在 log4net 为您提供的良好分离的关注模型中,应用程序本身对其进行的修改没有意义。

标签: c# asp.net-web-api log4net


【解决方案1】:

如果您在程序中更改配置,它不会反映在配置文件中。如果您的应用程序正在监视您的配置,您可以通过直接编辑配置文件来更改日志级别。它将被 log4net 提取。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2023-04-11
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多