一,pom.xml导入依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
二、添加配置文件: logback.xml
配置文件结点如下:
2.1:appender标签
appender组件主要负责打印日志,设置日志输出位置,日志文件的生成策略等
1)ConsoleAppender:把日志打印到控制台
2)FileAppender:把日志输出到文件
3)RollingFileAppender:滚动记录地把日志输出到文件,支持日志文件按时间或文件大小拆分
下面以打印控制台日志和打印debug日志的代码片段进行说明:
<!-- 控制台 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--指定打印的格式->
<encoder>
<!-- (%d表示时间格式)年月日时分秒毫秒+线程+日志级别+类路径+日志信息+换行-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件存储路径 -->
<file>${log.filePath}/debug.log</file>
<!--通过TimeBasedRollingPolicy执行策略,按时间周期将日志文本文件以log.gz的方式进行存储-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 指定log.gz文件名称-->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!-- 文件最大保存历史数量 也就是当log.gz文件大于maxHistory时,执行滚动记录的策略-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!--日志打印格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--过滤器 将会过滤掉除debug级别以外的日志信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
2.2:logger标签
1)设置logger:用来设置某个包或某个指定类的日志打印级别,logger仅有一个name属性,一个可选的level和一个可选的addtivity属性。
- name:指定受此logger约束的某个包或指定类
- level:指定打印级别
- additivity:是否向上级logger传递打印信息,默认true
2)设置root:只有一个level属性用于指定打印级别,默认debug
level和root之间的关系可以看作是java中的子类和父类,通过additivity属性进行继承
<!-- logger的additivity为true,也就是继承了root的属性,所以下列所有的appender除了打印自己的日志级别输出到日志文件以外,还会打印root指定的info级别输出到控制台-->
<logger name="com.whl.o2o" level="debug" additivity="true">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<!--root 指定日志打印级别为info -->
<root level="info">
<!-- 通过控制台打印 -->
<appender-ref ref="consoleAppender"/>
</root>
2.3:过滤器
使用过滤器可以设置日志的传递.
- onMatch表示匹配大于这个级别的日志
- onMismatch表示匹配小于于这个级别的日志
其属性值可以为:ACCEPT–打印
DENY– 不打印
NEUTRAL–中立
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器指定为error级别,大于error级别的日志打印,小于error级别的日志不打印-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
三,通过实例验证配置
3.1:logback.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- TRACE<DEBUG<INFO<WARN<ERROR -->
<!-- 定义参数常量 -->
<property name="log.level" value="debug" />
<property name="log.maxHistory" value="30" />
<property name="log.filePath" value="d:/tomcat9/logs/o2o_logs" />
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
<!-- 控制台设置 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- INFO -->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR -->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.whl.o2o" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<root level="info">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
3.2:测试类
public class BaseTest {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(BaseTest.class);
//一般采用info记录方法的启动和结束
logger.info("===start===");
long startTime = System.currentTimeMillis();
//一般在抛出的异常中打印error信息
logger.error("test error");
long endTime = System.currentTimeMillis();
//一般debug用于记录用于调优的信息
logger.debug("costTime:[{}ms]",endTime-startTime);
logger.info("===end====");
}
}
输出结果:
该日志输出格式为logback.xml中控制台日志输出设置指定的encoding格式
2019-07-30 17:41:43.033 [main] INFO com.whl.o2o.BaseTest - =start=
2019-07-30 17:41:43.039 [main] ERROR com.whl.o2o.BaseTest - test error
2019-07-30 17:41:43.045 [main] DEBUG com.whl.o2o.BaseTest - costTime:[6ms]
2019-07-30 17:41:43.053 [main] INFO com.whl.o2o.BaseTest - =end==
3.3:输出到配置文件的log
可以看到,通过logger和root之间的配置关系,我们不仅可以在指定的路径生成日志文本,也可以在控制台中进行日志的打印