日志
概述
日志文件是用于记录系统操作时间的文件集合。可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。
-
调试日志
开发中使用日志能够更加灵活和方便的去重现开发中的的bug问题。
-
系统日志
系统日志是记录系统中硬件、软件和系统问题的信息,还可以监视系统中发生的事件。可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。
java日志框架
日志门面 : JCL 、 slf4j
日志实现 : JUL 、 logback 、 log4j 、 log4j2
日志门面
借鉴于JDBC的思想,为日志系统提供一套门面,可以面向这些接口规范进行开发,避免直接依赖具体的日志框架。
用户通过控制日志门面提供的日志接口实现具体日志框架技术
SLF4J
1. 依赖
<!-- slf4j-core 使用slf4j门面核心 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<!-- slf4j 自带的简单日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
2. 测试代码
public class slf4jTest {
public final static Logger LOGGER = LogerFactory.getLogger(slf4jTest.class);
@Test
public void test() throws Exception {
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
//使用占位符输出日志
String name=cccq;
Integer age=18;
LOGGER.info("User:{},{}",name,age);
}
}
3. 绑定日志的实现
SLF4J附带几个SLF4J绑定的jar文件,每个绑定对应一个受支持的框架
- 绑定流程
- 添加slf4j-api的依赖
- 使用slf4j的API在项目中进行统一的日志记录
- 绑定具体的日志实现框架
- 绑定已经实现了slf4j的日志框架,直接添加对应依赖
- 绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖
slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
-
依赖
<<!-- slf4j-core 使用slf4j门面核心 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <!-- log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- jul --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.5.6</version> </dependency> <!-- jcl --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jcl</artifactId> <version>1.7.30</version> </dependency> <!-- 不使用日志实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.30</version> </dependency>
要切换日志框架,只需替换类路径上的slf4j绑定。 例:从java.util.logging切换到log4j,只需将依赖 slf4j-jdk14 改为 slf4j-log4j12
4. 桥接旧的日志框架
从旧的其他日志实现升级到使用slf4j日志门面,slf4j附带了几个桥接模块,这些模块将对log4j,JCL和java.util.logging的调用重定向,就好像他们是对SLF4J一样
-
步骤 :
- 去除之前老的日志框架的依赖
- 添加SLF4J提供的桥接组件
- 为项目添加SLF4J的具体实现
-
依赖
<!-- log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.30</version> </dependency> <!-- jul --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.5.6</version> </dependency> <!-- jcl --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.30</version> </dependency>
-
注意问题:
- jcl-over-slf4j 和 slf4j-jcl 不能同时部署,前一个jar将导致jcl将日志系统的选择委托给SLF4J,后一个jar文件将导致SLF4J将日志系统的选择委托给JCL,从而导致死循环
- log4j-over-slf4j 和 slf4j-log4j12 不能同时出现
- jul-over-slf4j 和 slf4j-jdk14 不能同时出现
- 所有的桥接都只对Logger日志记