- 1、Logback
- 1.1、Logback简介
- 1.2、Logback中的组件
- 1.3、基础日志输出格式
- 1.4、入门使用
- 1.5、异步日志
- 2、Log4j2
- 2.1、Log4j2简介
- 2.2、Log4j2特征
- 2.3、入门使用
- 2.4、slf4j搭配log4j2使用
- Logback是由log4j创始人设计的又一个开源日志组件
- Logback当前分成三个模块:logback-core,logback- classic和logback-access
- logback-core是其它两个模块的基础模块,类似与springframework
- logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能
- Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别
- Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等
- Layout:负责把事件转换成字符串,格式化的日志信息的输出。在Logback中Layout对象被封装在encoder中。也就是说我们未来使用的encoder其实就是Layout
- %-10level 级别:案例为设置10个字符,左对齐
- %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
- %c: 当前类全限定名
- %M: 当前执行日志的方法
- %L: 行号
- %thread: 线程名称
- %m或者%msg: 信息
- %n: 换行
基础使用
依赖
org.slf4j slf4j-api 1.7.25 ch.qos.logback logback-classic 1.2.3
导包
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
- 日志级别:trace < debug < info < warn < error
- 默认的日志级别是debug
@Test
public void test01(){
Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:logback默认输出格式
11:21:36.810 [main] ERROR com.xc.mylog.LOGBACKTest - error信息 11:21:36.812 [main] WARN com.xc.mylog.LOGBACKTest - warn信息 11:21:36.812 [main] INFO com.xc.mylog.LOGBACKTest - info信息 11:21:36.812 [main] DEBUG com.xc.mylog.LOGBACKTest - debug信息 Process finished with exit code 0
使用logback.xml
- 在resources下面,创建一份配置文件,命名为logback.xml
${logDir}/logback.log ${pattern} System.err ${pattern}
@Test
public void test02(){
Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
[ERROR] 2022-06-26 20:26:07.401 com.xc.mylog.LOGBACKTest test01 24 main error信息 [WARN ] 2022-06-26 20:26:07.403 com.xc.mylog.LOGBACKTest test01 25 main warn信息 [INFO ] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 26 main info信息 [DEBUG] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 27 main debug信息 [TRACE] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 28 main trace信息 Process finished with exit code 0
执行两次查看文件输出内容:
- 在文件中,默认是以追加日志的形式做记录
日志拆分和归档压缩
logback.xml
${pattern} ${logDir}/roll_logback.log ${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz 100KB
@Test
public void test03(){
for (int i = 0; i < 1000; i++) {
Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
26日,27日分别执行一次,文件拆分输出结果:
当前日志为roll_bogback.log,当日志文件超过100k或者切换日期则会压缩成日期格式gz
日志进行更细粒度的打印控制
logback.xml
System.err ${pattern} ERROR ACCEPT DENY
@Test
public void test04(){
Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
[ERROR] 2022-06-26 22:43:54.133 com.xc.mylog.LOGBACKTest test06 148 main error信息 Process finished with exit code 0
自定义logger
additivity=“false” 表示不继承rootlogger
1.5、异步日志
- 原理:系统会为日志操作单独的分配出来一根线程,原来用来执行当前方法的主线程会继续向下执行
- 线程1:系统业务代码执行,线程2:打印日志,两根线程争夺CPU的使用权
System.err ${pattern}
@Test
public void test05(){
Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
//日志打印操作
for (int i = 0; i < 100; i++) {
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
//系统本身业务相关的其他操作
System.out.println("1----------------------");
System.out.println("2----------------------");
System.out.println("3----------------------");
System.out.println("4----------------------");
System.out.println("5----------------------");
}
输出结果:日志和业务代码交替执行
[ERROR] 2022-06-26 22:56:29.948 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 1---------------------- [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 2---------------------- 3---------------------- 4---------------------- 5---------------------- [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息 [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息 [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息 [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息 [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息 Process finished with exit code 02、Log4j2 2.1、Log4j2简介
- Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题
- 被誉为是目前最优秀的Java日志框架
性能提升
- Log4j2包含基于LMAX Disruptor库的下一代异步记录器
- 在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低
自动重新加载配置
- 与Logback一样,Log4j2可以在修改时自动重新加载其配置
- 与Logback不同,它会在重新配置发生时不会丢失日志事件
高级过滤
- 与Logback一样,Log4j2支持基于Log事件中的上下文数据,标记,正则表达式和其他组件进行过滤
- 过滤器还可以与记录器关联。与Logback不同,Log4j2可以在任何这些情况下使用通用的Filter类
无垃圾机制
- 在稳态日志记录期间,Log4j2 在独立应用程序中是无垃圾的
- 在Web应用程序中是低垃圾
基础使用
依赖
org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1
导包
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
- 单纯的使用Log4j2的 门面+实现
- 默认为error级别信息的打印
@Test
public void test01(){
Logger logger = LogManager.getLogger(Log4j2Test.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
//警告 //表示我们还没有建立自己的配置文件,如果没有建立配置文件,则使用默认的配置 ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 20:32:32.558 [main] FATAL com.xc.mylog.Log4j2Test - fatal信息 20:32:32.561 [main] ERROR com.xc.mylog.Log4j2Test - error信息 Process finished with exit code 0
基础配置文件使用
默认路径:resources/log4j2.xml
- monitorInterval=“5” 自动加载配置文件的间隔时间,不低于5秒
@Test
public void test02(){
Logger logger = LogManager.getLogger(Log4j2Test.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
fatal信息 error信息 warn信息 info信息 debug信息 trace信息 Process finished with exit code 02.4、slf4j搭配log4j2使用
当今市场上的最强大,最主流的日志使用搭配方式:slf4j+log4j2
依赖
org.slf4j slf4j-api 1.7.25 org.apache.logging.log4j log4j-slf4j-impl 2.12.1 org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1
导包
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
log4j2.xml
- slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现
@Test
public void test03(){
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
error信息 warn信息 info信息 debug信息 trace信息 Process finished with exit code 0
日志拆分
log4j2.xml
D://test
@Test
public void test05(){
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
for (int i = 0; i < 2000; i++) {
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
输出文件结果:



