【发布时间】:2019-10-23 14:47:06
【问题描述】:
我在运行我的 Spring Boot 应用程序时遇到了一些奇怪的问题。它已被配置为使用 Log4J2 作为其记录器(Logback 记录器已被禁用)。
log4j2.xml:
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="serviceName">$${sys:service.name}</Property>
<Property name="serviceId">$${sys:service.id}</Property>
<Property name="LOG_PATTERN">
[%d{yyyy-MM-dd HH:mm:ss.SSS}] %t %-5p: %c{2}:%L - %m%n
</Property>
<Property name="STATS_PATTERN">
%m%n
</Property>
<Property name="logFile">logs/$${sys:service.name}-$${sys:service.id}</Property>
<Property name="statsFile">metrics/$${sys:service.name}-$${sys:service.id}_stats.json</Property>
<!--
<Property name="logFile">logs/${serviceName}-${serviceId}</Property>
<Property name="statsFile">metrics/${serviceName}-${serviceId}_stats.json</Property>
-->
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<RollingFile name="RollingFile" fileName="${logFile}.current-session.log"
filePattern="${logFile}.%i.log.gz" ignoreExceptions="false">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
<File name="StatsFile" fileName="${statsFile}" append="false">
<PatternLayout>
<Pattern>${STATS_PATTERN}</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="<package>.StatsWriter" level="info" additivity="false">
<AppenderRef ref="StatsFile" />
</Logger>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
主要问题
我在 log4j2.xml 文件中有一些变量替换以允许变化,特别是日志文件名。当我运行应用程序时,日志文件会在正确的目录中创建,并且看起来确实有实际的日志内容。问题是它们的名称不正确。例如,文件名为 ${sys:service.name}-${sys:service.id}.current-session.log,而不是 Client-1.current-session.log。显然变量替换没有按计划进行。
属性service.name 和service.id 是当前在关联的application.yml 文件中定义的Spring Boot 配置参数。我原以为文件中的属性会可用,但显然不是这样。
有没有办法让 application.yml 属性在这里可用?如果这不可行,有什么其他方法可以做到这一点?
次要问题
当我在测试环境中执行应用程序时,我将记录器设置为输出到控制台:
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
</Root>
当它执行时,输出会显示在控制台上,但奇怪的是,还会创建日志文件。为什么会这样?
注意:
有一个现有的 SO 项目 (Use Spring boot application properties in log4j2.xml)(这是第二个答案)可以解决这个问题,但它似乎(正如作者承认的那样)有点 hacky。我还没试过(还)。
我对 application-"profile".yml 和 log4j2-spring.xml 的引用有点困惑。我不熟悉这些文件名的这些变体。这些变体(两种文件类型)的意义是什么?
【问题讨论】:
标签: java spring-boot log4j2