一、Logback的使用
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
1. Logback主要分为三个模块
Ø logback-core:其它两个模块的基础模块
Ø logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
Ø logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
Ø 后续的日志代码都是通过SLF4J日志门面搭建日志系统,所以在代码是没有区别,主要是通过修改配置文件和pom.xml依赖
2. logback入门
Ø 依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.27</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
Ø 代码
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo1 {
private static final Logger LOGGER = LoggerFactory.getLogger(Demo1.class);
@Test
public void test1(){
//打印日志信息
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");//默认级别
LOGGER.trace("trace");
}
}
输出: |
3. logback配置
logback会依次读取以下类型配置文件:
1.logback.groovy
2.logback-test.xml
3.logback.xml
4.如果均不存在会采用默认配置
1》logback组件之间的关系
1. Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
2. Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
3. Layout:负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封装在encoder中。
2》基本配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!-- 输出的位置:控制台输出
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>
<!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
输出: |
3》文件输出:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志文件存放的路径-->
<property name="log_dir" value="D://logs"></property>
<!-- 输出的位置:文件输出 -->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--文件保存的路径-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<root level="ALL">
<appender-ref ref="file"/>
</root>
</configuration>
输出: |
4》文件输出(html)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志文件存放的路径-->
<property name="log_dir" value="D://logs"></property>
<!-- 输出的位置: html 格式日志文件输出-->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--文件保存的路径-->
<file>${log_dir}/logback.html</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${pattern}</pattern>
</layout>
</encoder>
</appender>
<!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<root level="ALL">
<appender-ref ref="file"/>
</root>
</configuration>
输出: |
5》日志拆分、压缩和过滤
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志文件存放的路径-->
<property name="log_dir" value="D://logs"></property>
<!-- 输出的位置: 日志拆分、归档压缩和过滤 -->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件保存的路径-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--拆分规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照时间和压缩格式声明拆分的文件名-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!--日志级别过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
</configuration>
输出: |
6》异步日志和自定义logger
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志文件存放的路径-->
<property name="log_dir" value="D://logs"></property>
<!-- 输出的位置: 日志拆分、归档压缩和过滤 -->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件保存的路径-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--拆分规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照时间和压缩格式声明拆分的文件名-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!--日志级别过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--异步日志-->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollFile"/>
</appender>
<!--root logger 配置-->
<!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
<!---自定义logger-->
<!--
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<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 name="com.hk.log.logback" level="info" additivity="false">
<appender-ref ref="rollFile"/>
</logger>
</configuration>
4. 官方提供的log4j.properties转换成logback.xml
https://logback.qos.ch/translator/
5. logback-access的使用
logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。我们可以使用logback-access模块来替换tomcat的访问日志。
1. 将logback-access.jar与logback-core.jar复制到$TOMCAT_HOME/lib/目录下
2. 修改$TOMCAT_HOME/conf/server.xml中的Host元素中添加:
<Valve className="ch.qos.logback.access.tomcat.LogbackValve" /> |
3. logback默认会在$TOMCAT_HOME/conf下查找文件 logback-access.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- always a good activate OnConsoleStatusListener --> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/> <property name="LOG_DIR" value="${catalina.base}/logs"/> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern> </rollingPolicy> <encoder> <!-- 访问日志的格式 --> <pattern>combined</pattern> </encoder> </appender> <appender-ref ref="FILE"/> </configuration> |
4. 官方配置:
https://logback.qos.ch/access.html#confifiguration