在写项目的时候,对于一些重要的信息,或者程序抛出的异常,我们一般都会用日志记录下来。方便后期排查问题。在springboot项目中,我一般使用 Slf4j+logback 作为日志框架。下面就简单介绍一下他们的使用
Slf4j
The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。
使用:
yml简单配置 (用了logback-spring.xml就可以不需要这些配置)
logging:
#生成的日志文件名
file: doc/mybatis.log
#相关包的日志级别
level:
top.lvjp.mybatis: info
top.lvjp.mybatis.mapper: trace
pattern:
#控制台输出日志格式
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} - %-5level [%thread] %logger - %msg%n"
public class Test{
private final Logger log = LoggerFactory.getLogger(Test.class);
public void test (String param) {
// 重要的有用的的数据才打印,不然影响程序运行效率
log.info("接收到一个参数 param={}", param);
try{
// 假装对context操作时,抛出了一个异常
throw new RuntimeException("test");
} catch {
// 打印相关的信息,以及异常的方法栈信息
log.error("这里报错了, param={}", param, e);
}
}
}
Logback
LogBack 被分为3个组件
- logback-core 提供了LogBack的核心功能,是另外两个组件的基础。
- logback-classic 则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。
- logback-access 是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。
logback中三个重要概念:
- Logger: 日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,定义日志类型,级别。
- Appender: 指定日志输出的目的地,目的地可以是控制台,文件,或者数据库等
- Layout: 负责把事件转换成字符串,格式化日志信息的输出
maven依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<!--logback-classic中已经引入了slf4j-api和logback-core依赖-->
</dependency>
logback-spring.xml配置
SpringBoot官方推荐优先使用带有-spring的文件名作为日志配置(可以为它添加一些SpringBoot特有的配置项)。不过也可以通过logging.config属性自定义的名字:
# 指定配置文件
logging.config=classpath:logging-config.xml
这里使用 logback-spring.xml 作为文件名
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan: 默认为true,如果配置文件发生改变,将会被重新加载
scanPeriod: scan为true生效,默认一分钟,监测配置文件是否有修改,若没给时间单位,默认为毫秒
debug: 默认false,不打印logback内部日志信息
-->
<configuration scan="true" scanPeriod="6000" debug="false">
<!-- 上下文 -->
<contextName>logback</contextName>
<!-- 设置变量name,通过${name}取值 -->
<property name="log.path" value="doc/logback" />
<!--appender用来格式化日志输出的节点,class用来指定哪种输出策略,常用的为控制台和文件输出策略-->
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 添加 范围 过滤 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- %d 日志输出时间, %thread 输出日志的进程名字, %-5leve 日志级别,并使用5个字符向左对齐, %msg 日志信息, %n 平台的换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</layout>
</appender>
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--<file>${log.path}</file>-->
<!-- 按天数输出日志文件,一天一个 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名的格式 -->
<fileNamePattern>${log.path}/mybatis-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志文件保留的最大天数 -->
<maxHistory>60</maxHistory>
<!-- 总的日志文件大小的上限-->
<totalSizeCap>100MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<appender name="infoFile" class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 要拦截的日志级别-->
<level>ERROR</level>
<!-- 如果匹配,则禁止-->
<onMatch>DENY</onMatch>
<!-- 如果不匹配,则允许记录-->
<onMismatch>ACCEPT</onMismatch>
</filter>
</appender>
<!-- root节点用来指定最基础的日志输出级别, level属性设置打印级别,默认debug -->
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="errorFile" />
<appender-ref ref="infoFile" />
</root>
</configuration>