【问题标题】:How to pass properties from application.properties to logback config file如何将属性从 application.properties 传递到 logback 配置文件
【发布时间】:2017-03-22 17:32:18
【问题描述】:

概览:

我在 logback.xml 文件中使用 Sentry 附加程序,我想将大量标签作为参数从 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 传递给配置文件。

因此,我们将非常感谢任何解决方案、反馈和想法。

【问题讨论】:

    标签: spring-boot logback sentry


    【解决方案1】:

    logback.xml 中包括:

    <property resource="application.properties" />
    

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

    【讨论】:

    • 非常感谢,我忘了这个包括了。
    • 嗯,这很有帮助 - 我有一个额外的要求,我想传递 - 我的命令行参数中的 application.properties 路径,有没有办法做到这一点,我试着把它挖出来 - 但是什么都没得到
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您现在可以通过 logback 上下文或第三方编码器直接执行此操作。

        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        context.putProperty("global", "value");
      

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

      【讨论】:

        【解决方案4】:

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

        这是我的解决方案,假设您有不同的弹簧配置文件,并基于它想要更改配置,如 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 文件。

        【讨论】:

        • 看起来不错的答案,但它不起作用....
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多