如何将属性从application.properties传递到logback配置文件

时间:2016-11-08 23:05:45

标签: spring-boot logback sentry

概述:

我在我的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传递给配置文件。

所以任何解决方案,反馈和想法都会受到高度赞赏。

4 个答案:

答案 0 :(得分:10)

logback.xml包括:

<property resource="application.properties" />

然后您可以以标准方式引用属性,例如${app.name}

答案 1 :(得分:2)

我发现Spring支持下一个标记<springProperty/>描述here。这意味着您可以轻松地从属性文件中添加变量,即使此变量值spring也可以从环境/系统变量中解析。

答案 2 :(得分:0)

您现在可以直接通过登录上下文或通过第三方编码器进行操作。

//Save the values to Localstorage
localStorage.setItem('first','firstvalue');
localStorage.setItem('second','secondvalue');

//Retrieve the values from localstorage
localStorage.getItem('first')
//"firstvalue"
localStorage.getItem('second')
//"secondvalue"

https://github.com/getsentry/sentry-java/pull/794

答案 3 :(得分:0)

我知道这是一个老问题,但这仍然是一个有效的问题。

这是我的解决方案,假设您有一个不同的弹簧配置文件,并基于它想要更改配置,如 log pattern, path of log file create, size of log file ...etc.

它可以像下面那样做,

比方说,我们有两个名为 devprod 的配置文件,这些配置文件如下所示,

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 文件的开销。