日志在系统中起着回溯运行历史的重要作用,现在java日志当中有两大阵营,分别是Commons Logging和Slf4j,Log4j/Log4j2和Logback分别是其的实现。Spring Boot默认使用的是Slf4j+Logback组合,本文将阐述如何在springboot中使用Logback日志模块。
1、环境约束
- win10 64位操作系统
- idea2018.1.5
- maven-3.0.5
- jdk-8u162-windows-x64
2、前提约束
- 完成springboot创建web项目 https://www.jianshu.com/p/de979f53ad80 注意:笔者创建项目的时候约束的包前缀是net.wanho.springboot.logdemo,读者可以自行创建包名,只是要注意本文中的代码也要修改包名。
3、配置logback
- 添加依赖
logback相关jar包在创建springboot web项目之时便已经被依赖,如下图 - 在主启动类同等目录下创建UserService.java【注意:这里没有定义service包,读者可以自行选择创建与否】
package net.wanho.springboot.logdemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private Logger logger = LoggerFactory.getLogger(UserService.class);
public String test()
{
logger.debug("debug");
logger.error("error");
return "userservice.test()";
}
}
- 在主启动类同等目录下创建UserController.java【注意:这里没有定义controller包,读者可以自行选择创建与否】
package net.wanho.springboot.logdemo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/test")
@ResponseBody
public String test()
{
return "success";
}
}
- 在src/main/resources当中新建logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--定义日志打印路径-->
<property name="log.path" value="D:/logback.log"/>
<!--日志打印到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--ConsoleAppender中的日志打印格式-->
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--日志输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--引用上文定义的日志打印路径-->
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义日志输入的文件名称,每天一个新的日志文件-->
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<!--文件中的日志打印格式-->
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--打印日志的级别,以及引用appender-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
<!--name可以是包名,也可以具体到某各类,在上述root约束之外的特别定义,不继承root以及其他logger定义 -->
<logger name="net.wanho.springboot.logdemo" level="DEBUG" additivity="false">
<!--net.wanho.springboot.logdemo路径下所有的日志打印到文件-->
<appender-ref ref="file"/>
</logger>
<!--name可以是包名,也可以具体到某各类,在上述root约束之外的特别定义,不继承root以及其他logger定义 -->
<logger name="net.wanho.springboot.logdemo.UserService" level="WARN" additivity="false">
<!--UserService类打印的日志到控制台-->
<appender-ref ref="console"/>
</logger>
</configuration>
- 修改application.properties
#引用日志配置文件
logging.config=classpath:static/logback-spring.xml
4、启动测试
启动之后,在浏览器中输入http://localhost:8080/test,查看控制台的日志及文件中的日志。
- 分析
(1)在命令行中,除了系统日志以外,我们自己代码打印日志如下【注意:在最后一行】:
16:18:25.104 logback [http-nio-8080-exec-1] ERROR n.w.springboot.logdemo.UserService - error
根据我们日志配置文件的约束:
<!--name可以是包名,也可以具体到某各类,在上述root约束之外的特别定义,不继承root以及其他logger定义 -->
<logger name="net.wanho.springboot.logdemo.UserService" level="WARN" additivity="false">
<!--UserService类打印的日志到控制台-->
<appender-ref ref="console"/>
</logger>
UserService类中打印的日志只在命令行显示,且只显示warn级别及其以后的,因此命令行只显示error日志。
(2)在日志文件中,除了系统日志以外,我们自己代码打印日志如下【注意:在最后一行】:
16:26:49.249 logback [http-nio-8080-exec-2] DEBUG n.w.s.logdemo.UserController - debug
16:26:49.250 logback [http-nio-8080-exec-2] ERROR n.w.s.logdemo.UserController - error
根据我们日志配置文件的约束:
<!--name可以是包名,也可以具体到某各类,在上述root约束之外的特别定义,不继承root以及其他logger定义 -->
<logger name="net.wanho.springboot.logdemo" level="DEBUG" additivity="false">
<!--net.wanho.springboot.logdemo路径下所有的日志打印到文件-->
<appender-ref ref="file"/>
</logger>
net.wanho.springboot.logdemo包下面所有的类只在文件中显示,且显示debug级别及其以后的,因此文件中既有debug也有error日志。
至此,我们完成了springboot中的日志使用。