使用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
我认为您无法通过代码重写log4j2.xml。
除了@ JamesR.Perkins所说的之外,[C0还说:
“”请注意,与Log4j 1.x不同,公共Log4j 2 API不会公开用于添加,修改或删除附加程序,过滤器或以任何方式操纵配置的方法。“
我相信您将不得不重新定义log4j2配置。
请随时借用我的榜样。如果对此有任何疑问,请随时提问:
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>
中设置了级别,它将记录该级别之间直至(包括)(错误)的所有内容。这有意义吗?
如果这没有帮助,请让我知道我所缺少的:)