【问题标题】:log4j2.xml is not picking the changes in system properties during the runtime?log4j2.xml 没有在运行时选择系统属性的更改?
【发布时间】:2018-09-26 10:34:51
【问题描述】:

使用 log4j2 记录器和服务器创建一个 spring-boot 应用程序是 wildfly10/jboss7.1。 我从 Configuration: System Properties 添加了“系统属性”:“loglevel”,并且能够从 Spring Boot 应用程序访问它。我在 log4j2.xml 中调用了这个系统属性来设置日志级别。 log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error" monitorInterval="30">
    <Properties>
        <Property name="basePath">D://propertieslog</Property>
    </Properties>

    <Appenders>

        <RollingFile name="fileLogger" fileName="${basePath}/acweb.log" filePattern="${basePath}/acweb-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
        <Jdbc name="databaseAppender" tableName="APPLICATION_LOG">
            <Filters>
                First deny warn, error and fatal messages
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL" />
                Then accept info, warn, error, fatal and deny debug/trace
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <ConnectionFactory class="path" method="getDatabaseConnection" />
            <Column name="LOGLEVEL" pattern="%level" />
            <Column name="LOGGER" pattern="%logger" />
            <Column name="MESSAGE" pattern="%message" />
        </Jdbc>
    </Appenders>
    <loggers>
        <Root level="${sys:loglevel:-ERROR}">
            <appender-ref ref="console" />
            <appender-ref ref="fileLogger" />
            <appender-ref ref="databaseAppender" />
        </Root>
    </loggers>

</configuration>

控制器类:

@GetMapping("/dashboard")
    public ModelAndView welcomeMethod(HttpServletRequest request, HttpServletResponse response,
            @ModelAttribute("token") final AccessToken accessToken) {
        if(null==accessToken.getJwtToken()) { 
            logger.trace("A TRACE Message");
            logger.debug("A DEBUG Message");
            logger.info("An INFO Message");
            logger.warn("An WARN Message");
            logger.warn("Printing system property1:"+ System.getProperty("loglevel"));
            logger.error("An ERROR Message");
            logger.error("Printing system property1:"+ System.getProperty("loglevel"));
            return new ModelAndView("redirect:launchApp"); 
        } 

问题是从wildfly控制台更改系统属性时,它反映在java类日志中,但它没有反映在log4j2.xml中。 log4j2.xml 中的日志级别保持为在应用程序构建期间设置的级别。

将 loglevel 系统属性设置为“WARN”并构建项目并部署它。日志如下:

[WARN ] 2018-09-26 15:13:05.787 [default task-7] WelcomeController - An WARN Message
[WARN ] 2018-09-26 15:13:05.792 [default task-7] WelcomeController - Printing system property1:WARN
[ERROR] 2018-09-26 15:13:05.793 [default task-7] WelcomeController - An ERROR Message
[ERROR] 2018-09-26 15:13:05.793 [default task-7] WelcomeController - Printing system property1:WARN

在同一部署中将 loglevel 系统属性更改为“INFO”,但日志没有更改为 INFO 级别:

[WARN ] 2018-09-26 15:15:34.933 [default task-11] WelcomeController - An WARN Message
[WARN ] 2018-09-26 15:15:34.933 [default task-11] WelcomeController - Printing system property1:INFO
[ERROR] 2018-09-26 15:15:34.935 [default task-11] WelcomeController - An ERROR Message
[ERROR] 2018-09-26 15:15:34.935 [default task-11] WelcomeController - Printing system property1:INFO

【问题讨论】:

  • 你是如何初始化 log4j2 日志管理器的?
  • 我是这些日志记录和 log4j2 的新手。您能否解释一下 log4j2 日志管理器。 @JamesR.Perkins
  • 一般来说,如果您更改系统属性,您需要重新加载日志管理器,因为配置已经被读取。

标签: java jboss7.x log4j2 wildfly-10 system-properties


【解决方案1】:

我不认为你可以通过代码重写 log4j2.xml。

除了@JamesR.Perkins 所说的,log4j2's configuration 表示:

“请注意,与 Log4j 1.x 不同,公共 Log4j 2 API 不公开添加、修改或删除附加程序和过滤器或以任何方式操作配置的方法。”

我相信您将不得不重新定义 log4j2 配置。

请随意借用我的例子。如果您对此有任何疑问,请随时提出:

Gist link to my example

Log4j2 提供了通过 Java 配置日志记录的指南,它有些帮助......可能有点令人困惑。 Here's their guide.

如果您知道 log4j2.xml 是如何设置的,那么在阅读指南和使用我的示例时会更容易一些。


附注...

我认为您的 &lt;ThresholdFilter&gt; 配置不正确。在您掌握它之前,这有点令人困惑。

首先,确定您希望记录器在哪个级别将日志条目打印到 databaseAppender (APPLICATION_LOG)。

按照我的阅读方式,你否认一切,然后接受追踪。最简单的方法是:

<Jdbc name="databaseAppender" tableName="APPLICATION_LOG">
    <ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL" />
    <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
    <!-- Other properties / attributes... -->
</Jdbc>

这就是它的翻译方式:

-------------------------------- |水平 |整数值 |行动 | -------------------------------- |致命 | 100 |拒绝 | -------------------------------- |错误 | 200 |拒绝 | -------------------------------- |警告 | 300 |拒绝 | -------------------------------- |信息 | 400 |拒绝 | -------------------------------- |调试 | 500 |拒绝 | -------------------------------- |追踪 | 600 |接受 | --------------------------------

如果您在 logger 中引用了 appender 并设置了一个级别,那么您就是在设置最低级别。

假设您没有为 Foo 设置 ThresHold 过滤器...

<appenders>
    <FileAppender name="Foo" fileName="theLogPath/fooLog.log" />
</appenders>
<Loggers>
    <Logger name="package.FooClass">
        <AppenderRef ref="Foo" level="INFO" />
    </Logger>
</Loggers>

这意味着将记录 Fatal 和 Info 之间的所有内容。如果您想同时包含 Info 和 Warn,但忽略其余部分,请将 &lt;ThresholdFilter&gt; 添加到 FileAppender,如下所示:

<FileAppender name="Foo" fileName="theLogPath/fooLog.log">
    <ThresholdFilter level="ERROR" onMatch="DENY" onMisMatch="ACCEPT" />
</FileAppender>

只要您在&lt;AppenderRef&gt; 中设置级别,它就会记录该级别之间的所有内容,包括 (ERROR)。

这有意义吗?

如果这没有帮助,请告诉我我缺少什么 :)

【讨论】:

  • 我认为您误解了手册。它说“Log4j API”没有公开操作配置的方法。但是,Log4j 实现可以。这些绝对可以用来修改根日志记录级别。检测系统属性更改的唯一方法是在设置系统属性后强制重新配置。这应该可以通过使用 Log4j Core 模块中的 Configurator 类来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2022-12-17
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多