Getting Started with Spring Boot - Basics (3) - Log Management

Spring Boot supports JUL, Log4J2 and Logback.

Default setting
- using SLF4J + Logback
- log output only to console
- level Level is INFO
- log file rotate size is 10Mb
- output format is: timestamp level process ID --- [thread name] class name log content
quote
2017-02-09 08:54:16.076  INFO 8296 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)


Output to file
src/main/resources/application.properties
quote
logging.path=d:

The spring.log file will be created in this directory, and the output content is the same as the console.

Detailed configuration
src/main/resources/application.properties
# Location of the log file.
logging.file=d:\\spring-boot-demo.log
# Appender pattern
logging.pattern.console=%date %-5level %logger{0} - %msg%n
logging.pattern.file=%date %-5level [%thread] %logger{0} [%file:%line] - %msg%n
logging.pattern.level=%5p
# Log levels - root
logging.level.=DEBUG
# Log levels - package
logging.level.org.springframework.web=INFO
# Log levels - class
logging.level.com.rensanning.springboot.HomeController=TRACE

*** logging.file and logging.path cannot be set at the same time

Test
code src/main/java/com/rensanning/springboot/HelloController.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	
    private final Logger log = LoggerFactory.getLogger(this.getClass());
	
    @RequestMapping("/")
    public String index() {
    	
        // Log a simple message
        log.debug("debug level log");
        log.info("info level log");
        log.warn("warn level log");
        log.error("error level log");
        
        return "Hello world from Spring Boot!";
    }
    
}


Visit http://localhost:8080/ after launching the app.

Console output:
quote
2017-02-09 09:00:13,031 DEBUG HelloController - debug level log
2017-02-09 09:00:13,031 INFO  HelloController - info level log
2017-02-09 09:00:13,031 WARN  HelloController - warn level log
2017-02-09 09:00:13,031 ERROR HelloController - error level log

File output content:
quote
2017-02-09 09:00:13,031 DEBUG [http-nio-8080-exec-1] HelloController [HelloController.java:17] - debug level log
2017-02-09 09:00:13,031 INFO  [http-nio-8080-exec-1] HelloController [HelloController.java:18] - info level log
2017-02-09 09:00:13,031 WARN  [http-nio-8080-exec-1] HelloController [HelloController.java:19] - warn level log
2017-02-09 09:00:13,031 ERROR [http-nio-8080-exec-1] HelloController [HelloController.java:20] - error level log


External configuration
src/main/resources/
  • Logback -> logback.xml 或 logback-spring.xml
  • Log4j2 -> log4j2.xml 或 log4j2-spring.xml
  • JUL -> logging.properties


src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <property name="log.base" value="d:" />
    <property name="log.level" value="DEBUG" />

    <!-- Appenders -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-5level %logger{0} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.base}/SpringSample.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.base}/SpringSample.%d{yyyyMMdd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date %-5level [%thread] %logger{0} [%file:%line] - %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 3rdparty Logger -->
    <logger name="org.springframework" level="${log.level}" />
    <logger name="org.apache.commons" level="INFO" />
    <logger name="org.apache.tiles" level="INFO" />
    <logger name="org.apache.ibatis" level="${log.level}" />
    <logger name="org.apache.shiro" level="${log.level}" />
    <logger name="org.dozer" level="INFO" />
    <logger name="org.scribe" level="${log.level}" />
    
    <!-- Application Logger -->
    <logger name="com.rensanning.springboot" level="${log.level}" />
    
    <!-- Root Logger -->
    <root level="${log.level}">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>


Visit http://localhost:8080/ after launching the app.

Console output:
quote
DEBUG HelloController - debug level log
INFO  HelloController - info level log
WARN  HelloController - warn level log
ERROR HelloController - error level log

File output content:
quote
2017-02-09 09:07:00,191 DEBUG [http-nio-8080-exec-1] HelloController [HelloController.java:17] - debug level log
2017-02-09 09:07:00,191 INFO  [http-nio-8080-exec-1] HelloController [HelloController.java:18] - info level log
2017-02-09 09:07:00,191 WARN  [http-nio-8080-exec-1] HelloController [HelloController.java:19] - warn level log
2017-02-09 09:07:00,191 ERROR [http-nio-8080-exec-1] HelloController [HelloController.java:20] - error level log


SpringBoot default configuration file
base.xml (console-appender.xml file-appender.xml)
https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org /springframework/boot/logging/logback/base.xml
<included>
	<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/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>


Partial settings (introduce base.xml)
src/main/resources/application.properties
quote
logging.path=d:

src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="com.rensanning.springboot" level="WARN" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
</configuration>


Visit http://localhost:8080/ after launching the app.

Console output:
quote
2017-02-09 09:13:43.723  WARN 5648 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : warn level log
2017-02-09 09:13:43.723 ERROR 5648 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : error level log

File output content:
quote
2017-02-09 09:13:43.723  WARN 5648 --- [http-nio-8080-exec-1] c.rensanning.springboot.HelloController  : warn level log
2017-02-09 09:13:43.723 ERROR 5648 --- [http-nio-8080-exec-1] c.rensanning.springboot.HelloController  : error level log


使用<springProfile>
src/main/resources/application.properties
quote
logging.path=d:

src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <springProfile name="dev,staging">
        <logger name="com.rensanning.springboot" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
        </logger>
    </springProfile>
    <springProfile name="production">
        <logger name="com.rensanning.springboot" level="WARN" additivity="false">
            <appender-ref ref="FILE" />
        </logger>
    </springProfile>
</configuration>


Add the VM parameter -Dspring.profiles.active=dev to start the application and visit http://localhost:8080/.

There is no output to the file, but the console output reads:
quote
2017-02-09 09:19:01.882 DEBUG 7676 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : debug level log
2017-02-09 09:19:01.882  INFO 7676 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : info level log
2017-02-09 09:19:01.882  WARN 7676 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : warn level log
2017-02-09 09:19:01.882 ERROR 7676 --- [nio-8080-exec-1] c.rensanning.springboot.HelloController  : error level log


Add the VM parameter -Dspring.profiles.active=production and visit http://localhost:8080/ after starting the application.

There is no output to the console, but the file outputs:
quote
2017-02-09 09:20:31.243  WARN 7436 --- [http-nio-8080-exec-1] c.rensanning.springboot.HelloController  : warn level log
2017-02-09 09:20:31.243 ERROR 7436 --- [http-nio-8080-exec-1] c.rensanning.springboot.HelloController  : error level log


Using <if><then><else>
Logback also supports conditional judgments in configuration files through the Janino package. http://janino-compiler.github.io/janino/

<dependency>
   <groupId>org.codehaus.janino</groupId>
   <artifactId>janino</artifactId>
   <version>2.7.8</version>
</dependency>


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <if condition='property("spring.profiles.active").contains("dev")'>
        <then>
            <logger name="com.rensanning.springboot" level="DEBUG" additivity="false">
                <appender-ref ref="CONSOLE" />
            </logger>
        </then>
        <else>
            <logger name="com.rensanning.springboot" level="WARN" additivity="false">
                <appender-ref ref="FILE" />
            </logger>
        </else>
    </if>
</configuration>


Using Log4J 2

pom.xml
quote
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <exclusions> 
        <exclusion> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-logging</artifactId> 
        </exclusion>
    </exclusions>
</dependency> 
<dependency>
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-log4j2</artifactId> 
</dependency>


src/main/resources/log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
    <Properties>
        <Property name="log-path">d:</Property>
    </Properties>
    <Appenders>
        <Console name="Console-Appender" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>
                    [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>>
            </PatternLayout>
        </Console>
        <File name="File-Appender" fileName="${log-path}/springboot_log.log" >
            <PatternLayout>
                <pattern>
                    [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Logger name="com.rensanning.springboot" level="info" additivity="false">
            <AppenderRef ref="Console-Appender"/>
        </Logger>
        <Root>
            <AppenderRef ref="File-Appender"/>
            <AppenderRef ref="Console-Appender"/>
        </Root>
    </Loggers>
</Configuration>


Visit http://localhost:8080/ after launching the app.

Console output:
quote
[INFO ] 2017-02-09 09:34:36.702 [http-nio-8080-exec-1] HelloController - info level log
[WARN ] 2017-02-09 09:34:36.702 [http-nio-8080-exec-1] HelloController - warn level log
[ERROR] 2017-02-09 09:34:36.702 [http-nio-8080-exec-1] HelloController - error level log

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326667114&siteId=291194637