11

I am building a command line application using Spring Boot. In such an application, logback console logging is not appropriate. How can I completely disable the console appender, but still have the file appender working with the default Spring Boot support?

Update

I have created a feature request for simpler support of this feature here:

https://github.com/spring-projects/spring-boot/issues/1612

btiernay
  • 7,873
  • 5
  • 42
  • 48

6 Answers6

12

Using Spring Boot 1.3.0, I created a file logback-spring.xml (in src/main/resources with the following content:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <springProfile name="dev">
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <springProfile name="staging,prod">
        <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
</configuration>

Additionally, I added the logging.file property in application-staging.properties and application-prod.properties to specify what the file name should be.

This will log to console for dev and to file for staging or prod profiles.

Wim Deblauwe
  • 25,113
  • 20
  • 133
  • 211
11

Just add a file called logback.xml in src/main/resources with content like (copied verbatim except for console part from Spring Boot's source):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>


    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] --- %-40.40logger{39} : %m%n%wex"/>

    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
        </rollingPolicy>
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>

</configuration>

Note that

<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>

is needed in order to support setting the log file from Spring Boot's logging.file and logging.path.

If all you want to do is set some standard log file, you could set place it's path in property above.

Update (02-04-2015)

In newer versions of Spring Boot you can easily just include the base.xml from Spring Boot and create the following logback.xml.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

Update (15-09-2017)

In order to get this working on Spring Boot 1.5.x and 2.0.0.M4 I added a file called logback-spring.xml and added it in the resources directory. The file could look like this

<?xml version="1.0" encoding="UTF-8"?>
<configuration>


    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] --- %-40.40logger{39} : %m%n"/>

    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
        </rollingPolicy>
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>

</configuration>
geoand
  • 60,071
  • 24
  • 172
  • 190
  • But https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org/springframework/boot/logging/logback/basic.xml includes `CONSOLE`. That wouldn't appear to work unless I'm missing something – btiernay Sep 24 '14 at 14:34
  • Thanks. Would that work if I was using `${logging.path}` / `${logging.file}` in my `application.yml`? I am typically setting these in system properties (`-D` flags) when I launch the application. – btiernay Sep 24 '14 at 14:45
  • I'll get back to you in a minute – geoand Sep 24 '14 at 14:45
  • @btiernay A first attempt at using those properties in a properties file was unsuccessful. I'll keep looking – geoand Sep 24 '14 at 14:49
  • @btiernay My comment above is wrong. Actually using the property `logging.file` in my `application.properties` produces the correct file output – geoand Sep 24 '14 at 15:03
  • 2
    I would suggest just doing what is in the shipped [`logback.xml`](https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback.xml) and simply add a root logger which only logs to file (just as @geoand did. Saves you copying the content from the earlier mentioned file. – M. Deinum Sep 24 '14 at 18:19
  • @M.Deinum logback.xml not found :( – Marsellus Wallace Apr 01 '15 at 23:00
  • 3
    In newer versions that has been renamed to `defaults.xml`. – M. Deinum Apr 02 '15 at 05:42
  • I am using 1.2.5.Release, adding in application specific logback.xml do not seem to work. It still continues to log on console. Below is the application specific logback.xml ` ` – Hussain Pirosha Jul 08 '15 at 07:54
  • @HussainPirosha You should probably create a new question that where you can post all the relevant code and more details regarding your problem – geoand Jul 08 '15 at 10:26
  • The updated solution doesn't work for me :( I had to take all the content of base.xml and redefine the root logger in order to have nothing on console. – user2668735 Sep 15 '17 at 10:50
3

Tested with latest 1.3.1 spring boot release..

place logback.xml under resource folder

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />

    <!-- Send debug messages to a file "application.log" -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>application.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <FileNamePattern>application.%i.log</FileNamePattern>
            <MinIndex>1</MinIndex>
            <MaxIndex>10</MaxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="FILE" />
    </root>
</configuration>

Also make sure to remove exclusions of spring-boot-starter-logging from "spring-boot-starter" and "spring-boot-starter-web" dependency, if you added exclusions before.

No need of below dependencies

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
</dependency>


<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.2</version>
</dependency>

application.properties

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
Pratap A.K
  • 4,337
  • 11
  • 42
  • 79
2

I tried removing console configuration from logback.xml. But, It was still logging in console. So What I did is, I just removed the appender being added in the logging configuration by springboot. Thereby, we can stop springboot logging in console and separate log file. Add the below lines at the end of your application specific appenders are added. Your custom appender should not match any of these appender names. It worked for me.

// get instance of your log4j instance
Logger logger = LogManager.getRootLogger();
logger.removeAppender("CONSOLE"); // stops console logging
logger.removeAppender("LOGFILE"); // stops file logging
Kaliappan
  • 642
  • 9
  • 24
  • I found that you needed: `appLogger.detachAppender("console")` (lowercase letters). However I am not using Spring boot, just a console app – ExactaBox Dec 16 '20 at 21:10
0

Include file-appender.xml and not console-appender with the following configuration in logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

You also need to add logging.file to your application.properties

This is in compliance with what is mentioned on spring boot documentation - http://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html

Paul Roub
  • 36,322
  • 27
  • 84
  • 93
panksy2k
  • 401
  • 5
  • 3
0

Add the below to your application.properties

logging.level.root=OFF
spring.main.banner-mode=OFF
Peter Szanto
  • 7,568
  • 2
  • 51
  • 53