springboot中使用logback
原文地址:https://blog.****.net/tianyaleixiaowu/article/details/73321610
Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计。本篇就是来看看如何使用logback。
新建一个Springboot项目,勾选web就OK了,项目会自动集成logback。
控制台日志
写一个controller测试一下:
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.web.bind.annotation.GetMapping;
-
import org.springframework.web.bind.annotation.RestController;
-
-
/**
-
* Created by admin on 17/6/16.
-
*/
-
@RestController
-
public class IndexController {
-
private final Logger logger = LoggerFactory.getLogger(getClass());
-
-
@GetMapping("/index")
-
public Object index() {
-
logger.debug("debug");
-
logger.info("info");
-
logger.warn("warn");
-
logger.error("error");
-
return "success";
-
}
-
}
需要注意:Logger是slf4j包中的logger,别引用错了。slf4j是一个工厂,可以和log4j、logback结合使用,熟悉工厂模式的自然理解。引用了logback那么Logger就会使用logback相关的方法来处理日志,引用了log4j也同理,这样能便于我们切换日志的实际处理类,这是工厂模式的优点。不要同时引用两个日志处理框架,这样工厂会懵逼的。
访问上面的controller,查看控制台打印:
2017-06-16 09:54:13.966 INFO 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : info
2017-06-16 09:54:13.967 WARN 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : warn
2017-06-16 09:54:13.967 ERROR 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : error
我们发现除了debug没出来,其他的都出来了。
这是因为Springboot的日志level来控制的,根据不同的level来显示。在哪里控制呢?正常来说,应该是由我们在resources下配置的spring-logback.xml来控制,但是我们什么都没写,那么他就走了Springboot默认的配置。
这里就是Springboot对logback配置的地方,base.xml里,可以看到root level=INFO,这个代表该项目默认是输出最低为info级别的日志。然后看到有两个append-ref,分别为console何file,这两个分别对应上面引用的两个include resource里的xml,每个名字对应一个处理类。
ConsoleAppender和FixedWindowRollingPolicy都是logback提供的两个Appender处理类,Appender类代表了对日志的处理方法,这个可以自定义。系统提供了很多个Appender,基本满足了大部分场景的需求,像Console就是输出到控制台的,System.out.print之类的,而File的就是输出到日志文件的。
刚才可以看到在控制台已经打印出了info及以上级别的日志了,那日志文件在哪里呢?
日志文件
file: ./logback.log
修改其他配置
file: ./logback.log
level:
com.example.demo: debug
使用自定义配置
修改日志级别
-
<?xml version="1.0" encoding="UTF-8"?>
-
<configuration>
-
<include resource="org/springframework/boot/logging/logback/base.xml" />
-
-
<root level="WARN">
-
<appender-ref ref="CONSOLE" />
-
<appender-ref ref="FILE" />
-
</root>
-
-
-
</configuration>
按包名区分日志级别
-
<?xml version="1.0" encoding="UTF-8"?>
-
<configuration>
-
<include resource="org/springframework/boot/logging/logback/base.xml" />
-
-
<root level="INFO">
-
<appender-ref ref="CONSOLE" />
-
<appender-ref ref="FILE" />
-
</root>
-
-
<logger name="org.springframework.web" level="INFO"/>
-
<logger name="com.example.demo" level="WARN"/>
-
</configuration>
-
<?xml version="1.0" encoding="UTF-8"?>
-
<configuration>
-
<include resource="org/springframework/boot/logging/logback/base.xml" />
-
-
<root level="INFO">
-
<appender-ref ref="CONSOLE" />
-
<appender-ref ref="FILE" />
-
</root>
-
-
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
-
<springProfile name="test,dev">
-
<logger name="org.springframework.web" level="INFO">
-
<appender-ref ref="FILE"/>
-
</logger>
-
<logger name="com.example" level="INFO" />
-
</springProfile>
-
-
<!-- 生产环境. -->
-
<springProfile name="prod">
-
<logger name="org.springframework.web" level="ERROR">
-
<appender-ref ref="FILE"/>
-
</logger>
-
<logger name="com.example" level="ERROR" />
-
</springProfile>
-
</configuration>
按时间自动滚动的日志文件
-
<appender name="MY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
<Prudent>true</Prudent>
-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
-
-
<maxHistory>30</maxHistory>
-
<totalSizeCap>3GB</totalSizeCap>
-
-
</rollingPolicy>
-
<layout class="ch.qos.logback.classic.PatternLayout">
-
<Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n</Pattern>
-
</layout>
-
<encoder>
-
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
-
</encoder>
-
</appender>
-
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
-
<springProfile name="test,dev">
-
<logger name="org.springframework.web" level="INFO">
-
<appender-ref ref="MY_FILE"/>
-
</logger>
-
</springProfile>
需要注意,Appender的定义要在上面,使用它的地方要在下面,不然会报错找不到Appender。