零、本文纲要
一、日志门面
二、JCL
三、SLF4J
四、Logback
五、log4j2
tips:Ctrl + F快速定位所需内容阅读吧。
一、日志门面
1、常见的日志门面
JCL、slf4j;
2、常见的日志实现
JUL、log4j、logback、log4j2
3、日志门面作用
- ① 面向接口开发,不再依赖具体的实现类,减少代码的耦合;
- ② 项目通过导入不同的日志实现类,可以灵活的切换日志框架;
- ③ 统一API,方便开发者学习和使用;
- ④ 统一配置便于项目日志的管理。
二、JCL
1、JCL简单介绍
全称为Jakarta Commons Logging,是Apache提供的一个通用日志API,自身提供日志实现SimpleLog(不推荐)。
它允许开发人员使用不同的具体日志实现工具: Log4j, Jdk自带的日志(JUL)。
JCL 有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)。
2、快速入门
- ① 导入依赖
commons-logging
commons-logging
1.2
- ② 测试
@Test
public void testQuick() throws Exception{
// 获取日志记录器对象
Log log = LogFactory.getLog(JCLTest.class);
// 日志记录输出
log.info("hello jcl");
}
- ③ 改用log4j日志实现
Ⅰ 导入依赖
log4j
log4j
1.2.17
Ⅱ log4j.properties
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为 trace,使用的 appender 为 console
log4j.rootLogger = fatal,console
# 指定控制台日志输出的 appender ,命名为 console
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-5p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
Ⅲ 测试
三、SLF4J
官方网址:SLF4J。
1、简单介绍
简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。
对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。
2、SLF4J日志门面功能
- ① 日志框架的绑定;
- ② 日志框架的桥接。
3、快速入门
- ① 添加依赖
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-simple
1.7.21
- ② 测试
@Test
public void testSLF4J(){
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
String hello = "Hello, ";
String slf4j = "slf4j.";
LOGGER.info("Say: {}{}", hello, slf4j);
try {
int i = 1 / 0;
} catch (Exception e) {
LOGGER.error("Something warn might have happened like:", e);
}
}
4、绑定日志的实现
- ① 使用slf4j的日志绑定流程:
Ⅰ 添加slf4j-api的依赖;
Ⅱ 使用slf4j的API在项目中进行统一的日志记录;
Ⅲ 绑定具体的日志实现框架:
-- 绑定已经实现了slf4j的日志框架,直接添加对应依赖;
-- 绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖;
Ⅳ slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)。 - ② 快速入门
Ⅰ 引入依赖
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-simple
1.7.21
ch.qos.logback
logback-classic
1.2.3
org.slf4j
slf4j-nop
1.7.21
org.slf4j
slf4j-log4j12
1.7.21
log4j
log4j
1.2.17
org.slf4j
slf4j-jdk14
1.7.25
org.slf4j
log4j-over-slf4j
1.7.25
Ⅱ 根据上图搭配测试
5、桥接旧的日志框架
- ① 添加依赖
org.slf4j
log4j-over-slf4j
1.7.27
org.slf4j
jul-to-slf4j
1.7.27
org.slf4j
jcl-over-slf4j
1.7.27
- ② 根据桥接需求选择对应依赖测试
四、Logback
官方网址:Logback Home (qos.ch)。
1、简单介绍
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
2、Logback主要模块
- ① logback-core:其它两个模块的基础模块;
- ② logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API;
- ③ logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。
3、快速入门
- ① 导入依赖
org.slf4j
slf4j-api
1.7.36
ch.qos.logback
logback-classic
1.2.11
- ② 测试
public class LogbackTest {
private static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
@Test
public void testLogback(){
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
4、logback配置
logback会依次读取以下类型配置文件:
- ① logback.groovy;
- ② logback-test.xml;
- ③ logback.xml(通常配置)。
如果均不存在会采用默认配置。
logback.xml实例如下:
- ① 配置通用属性property,以${name}方式引用;
- ② 配置appender,常用的有console、file、htmlFile、rollFile,特殊的async;
- ③ 配置rootLogger对象;
- ④ 配置自定义logger对象,配置addtivity="false"属性以不继承rootLogger对象。
System.err
${pattern}
${log_dir}/logback.log
${pattern}
${log_dir}/logback.html
%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m
${log_dir}/roll_logback.log
${pattern}
${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.tar.gz
1MB
ERROR
ACCEPT
DENY
5、log4j.properties转换成logback.xml工具
官方转换工具:log4j.properties Translator (qos.ch)。
五、log4j2
官方网址:Log4j – Apache Log4j 2。
1、认识log4j2
Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
- ①
异常处理
,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制; - ②
性能提升
, log4j2相较于log4j 和logback都具有很明显的性能提升,后面会有官方测试的数据; - ③
自动重载配置
,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用; - ④
无垃圾机制
,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。
2、快速入门
- ① 引入依赖
org.apache.logging.log4j
log4j-api
2.17.2
org.apache.logging.log4j
log4j-core
2.13.3
- ② 测试
// 定义日志记录器对象
public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class);
@Test
public void testLog4j2(){
LOGGER.fatal("fatal");
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
3、使用slf4j作为日志的门面,使用log4j2作为日志的实现
- ① 添加依赖
org.slf4j
slf4j-api
1.7.36
org.apache.logging.log4j
log4j-slf4j-impl
2.13.3
org.apache.logging.log4j
log4j-api
2.17.2
org.apache.logging.log4j
log4j-core
2.13.3
- ② 配置log4j2.xml
Ⅰ 配置通用属性property;
Ⅱ 配置Appenders,常见的有Console、File、RandomAccessFile、RollingFile;
Ⅲ 配置Root Logger。
/logs
4、log4j2异步日志
- ① 添加依赖
com.lmax
disruptor
3.3.2
- ② 配置log4j2.xml
Ⅰ AsyncAppender方式
/logs
Ⅱ AsyncLogger方式(推荐)
全局异步,需要添加一个log4j2.component.properties 配置,其余不变,内容如下:
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
混合异步,同时使用同步日志和异步日志,修改log4j2.xml,如下配置:
/logs
- ③ 异步日志注意的问题
Ⅰ 如果使用异步日志,AsyncAppender
、AsyncLogger
和全局日志
,不要同时出现。性能会和AsyncAppender一致,降至最低;
Ⅱ 设置includeLocation=false
,不然打印位置信息会急剧降低异步日志的性能,比同步日志还要慢。
六、结尾
以上即为日志门面的全部内容,感谢阅读。