I am trying to use an environment variable as ROOT_LOG_LEVEL to control the root log level for a project that uses a logback.xml configuration file.
<configuration>
<!-- You can override these with environment variables -->
<variable name="ROOT_LOG_LEVEL" value="$ROOT_LOG_LEVEL:-INFO" />
<variable name="EXAMPLE_LOG_LEVEL" value="$EXAMPLE_LOG_LEVEL:-INFO" />
<logger name="com.example" level="$EXAMPLE_LOG_LEVEL" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%level - %message</pattern>
</encoder>
</appender>
<root level="$ROOT_LOG_LEVEL">
<appender-ref ref="STDOUT" />
</root>
</configuration>
With this configuration, I can set the log level for package com.example by either setting the environment variable (e.g. EXAMPLE_LOG_LEVEL=TRACE), or by not setting the variable and falling back to the default INFO.
While this works for com.example, it does not work for the root logger. When I try to use a variable in level="$ROOT_LOG_LEVEL", it falls back to the internal default DEBUG regardless of the contents of the variable. Only if I replace $ROOT_LOG_LEVEL by an explicit value like INFO, the root logger is changed.
Is there a way to set the root log level based on a variable?
Apparently, the answer to my question is that Logback does not accept variables like this:
<variable name="ROOT_LOG_LEVEL" value="$ROOT_LOG_LEVEL:-INFO" />
<root level="$ROOT_LOG_LEVEL">
Instead, use:
<variable name="ROOT_LOG_LEVEL" value="${ROOT_LOG_LEVEL:-INFO}" />
<root level="${ROOT_LOG_LEVEL}">
That works! Note that the :-INFO must be inside the braces.