logback的使用
logback是由log4j的创始人设计的另一个开源日志组件,性能比log4j好
LogBack主要分为三个模块:
logback-core:其他两个模块的基础模块
logback-class:它是log4j的改良版本,完整实现了Slf4j API
logback-access:访问模块与servlet容器继承提供通过Http来访问日志的功能
后续代码都是通过Slf4j日志门面搭建日志系统,代码没有区别,主要是通过修改配置文件和pom.xml依赖
Logback入门
<dependencies>
<!--日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.31</version>
</dependency>
<!--logback日志实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- <scope>test</scope>-->
</dependency>
</dependencies>
public class LogBackTest {
/**
* 日志记录器对象
*/
private static final Logger LOGGER= LoggerFactory.getLogger(LogBackTest.class);
@Test
public void testQuick() throws Exception{
/*默认级别为info*/
LOGGER.info("info");
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.debug("debug");
LOGGER.trace("trace");
//使用占位符输出日志信息
String name="fei";
Integer age=20;
LOGGER.info("用户信息为--->姓名:{},年龄:{}",name,age);
}
}
输出
10:35:06.294 [main] INFO com.xxx.test.LogBackTest - info
10:35:06.297 [main] ERROR com.xxx.test.LogBackTest - error
10:35:06.297 [main] WARN com.xxx.test.LogBackTest - warn
10:35:06.297 [main] DEBUG com.xxx.test.LogBackTest - debug
10:35:06.297 [main] INFO com.xxx.test.LogBackTest - 用户信息为--->姓名:fei,年龄:20
logBack配置文件
logback会依次读取以下配置文件
logback.groovy
logback-test.xml
logback.xml
如果都不存在会采用默认配置
完整日志示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread]
%-5level %msg%n"/>
<!--
Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺
寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.err</target>
<!--日志格式配置-->
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
name:
用来指定受此logger约束的某一个包或者具体的某一个类。
level:
用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和
OFF,
如果未设置此属性,那么当前logger将会继承上级的级别。
additivity:
是否向上级loger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger
-->
<!--
也是<logger>元素,但是它是根logger。默认debug
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL
和 OFF,
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger。
-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
我们在Resource下创建logback.xml日志文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理的属性
直接使用该属性的value value格式":${name}
-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--控制日志输出位置的Appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
<target>System.err</target>
<!--日志消息格式的配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="ALL">
<appender-ref ref="console"></appender-ref>
</root>
</configuration>
FileAppender
日志输出到文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理的属性
直接使用该属性的value value格式":${name}
-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<!-- 日志文件存放目录 -->
<property name="log_dir" value="d:/lianxi"></property>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--控制日志输出位置的Appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
<target>System.err</target>
<!--日志消息格式的配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--日志文件输出appender对象-->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--日志格式配置-->
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--日志输出路径-->
<file>${log_dir}/logback.log</file>
</appender>
<root level="ALL">
<appender-ref ref="console"></appender-ref>
<appender-ref ref="file"></appender-ref>
</root>
</configuration>
日志输出到Html
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理的属性
直接使用该属性的value value格式":${name}
-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<!-- 日志文件存放目录 -->
<property name="log_dir" value="d:/lianxi"></property>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--html格式日志文件输出appender对象-->
<appender name="html" class="ch.qos.logback.core.FileAppender">
<!--html日志格式配置-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${pattern}</pattern>
</layout>
</encoder>
<!--日志输出路径-->
<file>${log_dir}/logback.html</file>
</appender>
<root level="ALL">
<appender-ref ref="html"></appender-ref>
</root>
</configuration>
日志拆分和归档Appender
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理的属性
直接使用该属性的value value格式":${name}
-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<!-- 日志文件存放目录 -->
<property name="log_dir" value="d:/lianxi"></property>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--控制日志输出位置的Appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
<target>System.err</target>
<!--日志消息格式的配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--日志拆分和归档Appender-->
<appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--日志输出路径-->
<file>${log_dir}/roll_logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--指定具体实现规则-->
<!--按照时间和压缩格式声明拆分的文件名-->
<!-- <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<root level="ALL">
<appender-ref ref="console"></appender-ref>
<appender-ref ref="rolling"></appender-ref>
</root>
</configuration>
日志级别过滤
只有大于等于设定级别会输出
<appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--日志输出路径-->
<file>${log_dir}/roll_logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--指定具体实现规则-->
<!--按照时间和压缩格式声明拆分的文件名-->
<!-- <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则-->
<level>INFO</level>
<!--超过当前级别放行-->
<onMath>ACCEPT</onMath>
<!--小于当前级别拦截-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
异步日志
我们当前的日志与代码都是使用主线程执行的 记录完日志才会往下执行 所以我们引入了异步日志
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理的属性
直接使用该属性的value value格式":${name}
-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<!-- 日志文件存放目录 -->
<property name="log_dir" value="d:/lianxi"></property>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--控制日志输出位置的Appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
<target>System.err</target>
<!--日志消息格式的配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--日志拆分和归档Appender-->
<appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--日志输出路径-->
<file>${log_dir}/roll_logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--指定具体实现规则-->
<!--按照时间和压缩格式声明拆分的文件名-->
<!-- <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则-->
<level>INFO</level>
<!--超过当前级别放行-->
<onMath>ACCEPT</onMath>
<!--小于当前级别拦截-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<!--指定某个具体的Appender实现-->
<appender-ref ref="rolling"/>
</appender>
<root level="ALL">
<appender-ref ref="async"></appender-ref>
</root>
</configuration>
自定义logger
<!--【强制】避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置 additivity=false。-->
<!--自定义logger additivity自定义logger对象是否继承rootLogger-->
<logger name="com.rpf" level="info" additivity="false">
<appender-ref ref="console"></appender-ref>
</logger>
此时日志只会输出到控制台不会输出到文件中
相关文章
暂无评论...