saeedj
saeedj

Reputation: 2419

How to pass properties from application.properties to logback config file

Overview:

I am using Sentry appender in my logback.xml file and I want to pass plenty of tags as parameters from application.properties file to logback config file.

logback.xml file:

<?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:[email protected]/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

Note: the spring.profiles.active property in application.properties is mapped to springProfile tag in logback config file.


But the issue is the fact that the "app.name" property cannot be found in logback.xml file. If I use this property as system properties it works but I want to pass it to config file from application.properties.

So any solution, feedback and idea would be highly appreciated.

Upvotes: 9

Views: 17648

Answers (4)

Supun Kavinda
Supun Kavinda

Reputation: 356

I know this is an old question but this is still a valid question.

Here is my solution, let's say you have a different spring profile and base on it want to change the configuration like log pattern, path of log file create, size of log file ...etc.

It can do it in like below,

let's say, We have two profile called dev and prod those config files look like below,

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

This is my logback.xml file

<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>

This solution will reduce multiple logback.xml files maintain over head.

Upvotes: 0

Jason
Jason

Reputation: 606

you can do it now directly via a logback context, or via a third party encoder.

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

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

Upvotes: 0

Andriy Rymar
Andriy Rymar

Reputation: 313

I found that Spring has support of next tag <springProperty/> described here . It means that you can easily add variable from property files even this variable value spring resolves from environment/system variable.

Upvotes: 8

Maciej Walkowiak
Maciej Walkowiak

Reputation: 12932

In logback.xml include:

<property resource="application.properties" />

And then you can refer properties in a standard way, for example ${app.name}.

Upvotes: 17

Related Questions