log4j2.xml在运行时未选择系统属性的更改?

问题描述 投票:0回答:1

使用log4j2记录器和服务器创建spring-boot应用程序是wildfly10 / jboss7.1。我从配置:系统属性添加了“系统属性”:“日志级别”,并能够从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>

Controller Class:

@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中的日志级别保持为在应用程序构建期间设置的级别。

将日志级别系统属性设置为“ 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

在同一部署上之后,将日志级别的系统属性更改为“ 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
java jboss7.x log4j2 wildfly-10 system-properties
1个回答
0
投票

我认为您无法通过代码重写log4j2.xml。

除了@ JamesR.Perkins所说的之外,[C0还说:

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

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

请随时借用我的榜样。如果对此有任何疑问,请随时提问:

log4j2's configuration

Log4j2提供了有关使用Java配置日志记录的指南,这有点帮助...可能会造成一些混乱。 Gist link to my example

如果您知道如何设置log4j2.xml,则在通读指南并使用我的示例时,它会使其变得更容易一些。


一点点注意...

我认为您的Here's their guide配置不正确。直到您掌握它为止,这有点令人困惑。

首先,准确地确定您希望记录器将什么日志记录打印到databaseAppender(APPLICATION_LOG)。我阅读它的方式,是您否认一切,然后接受跟踪。最简单的方法是:

<ThresholdFilter>

这是它将如何翻译:

--------------------------------|级别|整数值|动作|--------------------------------|致命100 |丹尼|--------------------------------|错误| 200 |丹尼|--------------------------------|警告| 300 |丹尼|--------------------------------|信息| 400 |丹尼|--------------------------------|调试| 500 |丹尼|--------------------------------|追踪| 600 |接受|--------------------------------

如果您在记录器中引用了一个附加程序并设置了一个级别,则您正在设置最低级别。

假设您没有为

Foo

...]设置ThresHold过滤器<Jdbc name="databaseAppender" tableName="APPLICATION_LOG"> <ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL" /> <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" /> <!-- Other properties / attributes... --> </Jdbc>
这意味着将记录致命和信息之间的所有内容。如果要同时包含“信息”和“警告”,但忽略其余部分,则可以如下所示向FileAppender添加<appenders>
    <FileAppender name="Foo" fileName="theLogPath/fooLog.log" />
</appenders>
<Loggers>
    <Logger name="package.FooClass">
        <AppenderRef ref="Foo" level="INFO" />
    </Logger>
</Loggers>

<ThresholdFilter>

并且只要您在<FileAppender name="Foo" fileName="theLogPath/fooLog.log">
    <ThresholdFilter level="ERROR" onMatch="DENY" onMisMatch="ACCEPT" />
</FileAppender>
中设置了级别,它将记录该级别之间直至(包括)(错误)的所有内容。

这有意义吗?

如果这没有帮助,请让我知道我所缺少的:)

© www.soinside.com 2019 - 2024. All rights reserved.