如何将属性从 application.properties 传递到 logback 配置文件
How to pass properties from application.properties to logback config file
概览:
我在 logback.xml 文件中使用 Sentry appender,我想将大量标签作为参数从 application.properties 文件传递到 logback 配置文件。
logback.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<appender name="SENTRY" class="com.getsentry.raven.logback.SentryAppender">
<dsn>
https://e0a61232c92f42ffa34c22914d676a8e:e64f7edc60de490eb004556d2b3fce45@sentry.io/112817
</dsn>
<springProfile name="dev">
<tags>env:dev,app:${app.name},platform:aws</tags>
</springProfile>
<springProfile name="stage">
<tags>env:dev</tags>
</springProfile>
<springProfile name="test">
<tags>env:test</tags>
</springProfile>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="ERROR">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="SENTRY"/>
</root>
</configuration>
application.properties:
security.ignored=/**
logging.level.root = DEBUG
spring.profiles.active=dev
app.name=retailServices
注:
application.properties 中的 spring.profiles.active 属性 映射到 logback 配置文件中的 springProfile 标签。
但是问题是在logback.xml文件中找不到"app.name"属性的事实。如果我使用这个 属性 作为系统属性,它可以工作,但我想将它传递给 application.properties 的配置文件。
因此,我们将不胜感激任何解决方案、反馈和想法。
在logback.xml
中包括:
<property resource="application.properties" />
然后您可以以标准方式引用属性,例如 ${app.name}
。
我发现 Spring 支持 <springProperty/>
描述的下一个标签 here 。这意味着您可以轻松地从 属性 文件添加变量,即使此变量值 spring 从 environment/system 变量解析。
您现在可以直接通过 logback 上下文或通过第三方编码器执行此操作。
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
context.putProperty("global", "value");
我知道这是一个老问题,但这仍然是一个有效的问题。
这是我的解决方案,假设您有一个不同的 spring 配置文件并基于它想要更改配置,例如 log pattern, path of log file create, size of log file ...etc.
它可以像下面那样做,
比方说,我们有两个名为 dev
和 prod
的配置文件,这些配置文件如下所示,
application-dev.properties
spring.application.name=Admin Module
logback.log.pattern=%-5level [%thread] %logger{36} : %X{correlationId} : %m%n
logback.app.log.root=C:\logs\adminModule\
logback.max.file.size=50MB
logback.max.file.history=2
application-prod.properties
spring.application.name=Admin Module
logback.log.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %-5level [%thread] %logger{36} : ${spring.application.name} : %X{correlationId} : %m%n
logback.app.log.root=\logs\adminModule\
logback.max.file.size=50MB
logback.max.file.history=30
application.properties
# (active profile can get dynamically)
spring.profiles.active=dev
这是我的 logback.xml
文件
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- get active profile-->
<springProperty scope="context" name="profile" source="spring.profiles.active"/>
<!-- get properties from active profile-->
<property resource="application-${profile}.properties" />
<property name="LOG_PATTERN" value="${logback.log.pattern}"/>
<property name="APP_LOG_ROOT" value="${logback.app.log.root}"/>
<property name="MAX_FILE_SIZE" value="${logback.max.file.size}"/>
<property name="MAX_FILE_HISTORY" value="${logback.max.file.history}"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${APP_LOG_ROOT}/info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_LOG_ROOT}/info.%d{yyyy-MM-dd_HH}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${MAX_FILE_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="infoLog"/>
<appender-ref ref="console"/>
</root>
</configuration>
此解决方案将减少多个 logback.xml
文件维护开销。
概览:
我在 logback.xml 文件中使用 Sentry appender,我想将大量标签作为参数从 application.properties 文件传递到 logback 配置文件。
logback.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<appender name="SENTRY" class="com.getsentry.raven.logback.SentryAppender">
<dsn>
https://e0a61232c92f42ffa34c22914d676a8e:e64f7edc60de490eb004556d2b3fce45@sentry.io/112817
</dsn>
<springProfile name="dev">
<tags>env:dev,app:${app.name},platform:aws</tags>
</springProfile>
<springProfile name="stage">
<tags>env:dev</tags>
</springProfile>
<springProfile name="test">
<tags>env:test</tags>
</springProfile>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="ERROR">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="SENTRY"/>
</root>
</configuration>
application.properties:
security.ignored=/**
logging.level.root = DEBUG
spring.profiles.active=dev
app.name=retailServices
注: application.properties 中的 spring.profiles.active 属性 映射到 logback 配置文件中的 springProfile 标签。
但是问题是在logback.xml文件中找不到"app.name"属性的事实。如果我使用这个 属性 作为系统属性,它可以工作,但我想将它传递给 application.properties 的配置文件。
因此,我们将不胜感激任何解决方案、反馈和想法。
在logback.xml
中包括:
<property resource="application.properties" />
然后您可以以标准方式引用属性,例如 ${app.name}
。
我发现 Spring 支持 <springProperty/>
描述的下一个标签 here 。这意味着您可以轻松地从 属性 文件添加变量,即使此变量值 spring 从 environment/system 变量解析。
您现在可以直接通过 logback 上下文或通过第三方编码器执行此操作。
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
context.putProperty("global", "value");
我知道这是一个老问题,但这仍然是一个有效的问题。
这是我的解决方案,假设您有一个不同的 spring 配置文件并基于它想要更改配置,例如 log pattern, path of log file create, size of log file ...etc.
它可以像下面那样做,
比方说,我们有两个名为 dev
和 prod
的配置文件,这些配置文件如下所示,
application-dev.properties
spring.application.name=Admin Module
logback.log.pattern=%-5level [%thread] %logger{36} : %X{correlationId} : %m%n
logback.app.log.root=C:\logs\adminModule\
logback.max.file.size=50MB
logback.max.file.history=2
application-prod.properties
spring.application.name=Admin Module
logback.log.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %-5level [%thread] %logger{36} : ${spring.application.name} : %X{correlationId} : %m%n
logback.app.log.root=\logs\adminModule\
logback.max.file.size=50MB
logback.max.file.history=30
application.properties
# (active profile can get dynamically)
spring.profiles.active=dev
这是我的 logback.xml
文件
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- get active profile-->
<springProperty scope="context" name="profile" source="spring.profiles.active"/>
<!-- get properties from active profile-->
<property resource="application-${profile}.properties" />
<property name="LOG_PATTERN" value="${logback.log.pattern}"/>
<property name="APP_LOG_ROOT" value="${logback.app.log.root}"/>
<property name="MAX_FILE_SIZE" value="${logback.max.file.size}"/>
<property name="MAX_FILE_HISTORY" value="${logback.max.file.history}"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${APP_LOG_ROOT}/info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_LOG_ROOT}/info.%d{yyyy-MM-dd_HH}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${MAX_FILE_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="infoLog"/>
<appender-ref ref="console"/>
</root>
</configuration>
此解决方案将减少多个 logback.xml
文件维护开销。