【问题标题】:How to allow user to make permanent changes to log levels?如何允许用户对日志级别进行永久更改?
【发布时间】:2016-11-03 17:37:22
【问题描述】:

我有一个使用 log4j2 进行日志记录的 Spring Boot 应用程序。我需要在运行时调整日志记录级别,我通过一个简单的 RESTful 接口完成了该操作,该接口接受记录器名称和需要设置的级别。我还需要能够永久更改日志记录级别(仅在某些记录器上)。

a) 有没有办法将我的更改保留回 log4j 配置文件,以便下次启动应用程序时,日志级别是上次运行时保留的位置?

b) 有没有办法读取配置文件中列出的记录器列表?

谢谢

【问题讨论】:

  • 您需要将它们写到某种持久性存储中,例如数据库。
  • 您的配置通常在您的 war/ear 文件中,因此您无法对其进行写入。容器不会让你。因此,正如@chrylis 所说,您需要将其存储在容器化应用程序通常可以访问的持久存储中。

标签: java logging spring-boot log4j2


【解决方案1】:

a) 如果你有一个配置文件,每次服务器启动时它都会用来配置 log4j2。您可以创建一个新的配置文件(在容器外)并在服务器启动时使用它来配置 log4j2:

    File file = new File("/config/new/log4j2.xml");             
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);     
    ctx.setConfigLocation(file.toURI());

或者只是存储新信息并以编程方式修改 log4j

b) 试试这个:

public Collection<Logger> getLoggers()

https://logging.apache.org/log4j/2.0/log4j-core/apidocs/org/apache/logging/log4j/core/LoggerContext.html#getLoggers()

这是一个代码示例(在应用程序启动时执行):

    File file = new File(log4jConfigFilePath);      
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    ctx.setConfigLocation(file.toURI());

    Collection<org.apache.logging.log4j.core.Logger> collection = ctx.getLoggers();     
    System.out.println(collection.size()); // returns 0 (No loggers instantiated)

    Logger logger = LoggerFactory.getLogger("myLogger");

    collection = ctx.getLoggers();      
    System.out.println(collection.size()); // returns 1 (myLogger instantiated)

【讨论】:

  • 谢谢@Marco。我的 log4j2 配置文件在容器之外。按照您指示的步骤,我没有取回配置文件中列出/配置的记录器列表。如果我克服了这个障碍并且允许以编程方式更改记录器级别,有没有办法将更改存储/持久化回配置文件?谢谢
  • getLoggers() 返回当前记录器,并且每个实例都应属于配置文件中列出的记录器之一。当然,如果您没有使用 LoggerFactory.getLogger(loggerName) 创建任何实例,它将返回 null。遗憾的是,没有办法持久使用 log4j2 API 以编程方式进行的更改。保持它的唯一方法是使用 java 的文件 I/O API 创建一个新的配置文件(或更新当前的配置文件)
  • getLoggers() 没有返回配置文件中的记录器。我是否必须依靠常规文件 I/O 和字符串解析来读取/解析并弄清楚这一点?谢谢
  • getLogger() 返回应用程序中已使用的记录器。如果您在配置文件中定义了一个记录器,但您的应用程序尚未实例化它,则该方法不会返回它。这是有道理的,为什么要以编程方式更改应用程序中未使用的记录器的配置?无论如何,是的,您应该依靠常规文件 I/O 来保持更改,但请注意 log4j 配置文件是用 XML、JSON、YAML 或属性格式编写的,因此您有工具可以轻松解析和修改它(不需要字符串解析)。
  • 原因是要找出初始记录器(比如说关键组件)要设置的内容并在 UI 中显示。最终,由于我希望保留更改,因此我需要知道它们是什么,下次应用程序出现时。但我确实明白你的意思。无论我是否 setConfigLocation(),我从 LoggerContext 获得的记录器列表都是相同的。它似乎什么也没做。我按照你所说的方式称呼它。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多