网站首页 > java教程 正文
一、Logback的使用
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
1. Logback主要分为三个模块
O logback-core:其它两个模块的基础模块
O logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
O logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
O 后续的日志代码都是通过SLF4J日志门面搭建日志系统,所以在代码是没有区别,主要是通过修改配置文件和pom.xml依赖
2. logback入门
O 依赖
<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>
O 代码
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
猜你喜欢
- 2025-07-10 SpringBoot扩展——定时任务!(springboot定时任务实现的几种方式)
- 2025-07-10 面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)
- 2025-07-10 开发必看!Spring Boot3 如何无缝整合 SkyWalking 实现高效性能监测
- 2025-07-10 Spring Boot3 中可整合的最新内容汇总
- 2025-07-10 每天一个 Python 库:logging 用法精讲,高效简洁的输出日志
- 2025-07-10 C#.NET log4net 详解(c#.net教程)
- 2025-07-10 java内存分析利器,mat与arthas哪个更强?
- 2025-07-10 Spring Boot3 学习提升相关知识点汇总
- 2025-07-10 Java日志埋点实战:3个技巧让Bug无所遁形
- 2025-07-10 我用半天时间解决了困扰团队一年多的cpu使用率过高问题
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)