Log4j

通过Log4j,我们可以控制日志信息输送到目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器。我们可以控制每一条日志的输出格式。通过定义每一条日志信息的级别,能更加细致地控制日志的生成过程。

1 log4j、log4j2与@SLF4J

2015年9月,Apache宣布不再维护Log4j。建议所有相关项目升级到Log4j2。Log4j2是Apache开发的一个新的日志框架,改进了Log4j的缺点,同时也借鉴了LogBack,号称在性能上也完胜LogBack。

|--------|--------------------|------------------------------|
| | log4j | log4j2 |
| 配置文件 | 以.properties的文件为主。 | 采用的是.xml,.json或者.jsn |
| 核心JAR包 | 只需引入一个jar包:log4j | 需要两个核心包:log4j-core和log4j-api |
| 配置文件方式 | 两者基本不同 ||

表 log4j与log4j2在用法上的主要区别

SFL4J 全称是Simple Logging Facade for Java(Java的简单日志门面),是外观模式的典型应用。

不同的日志框架,需要引入不同的jar包,及使用不同的代码获取Logger。如果项目升级需要更换不同的框架,那么就需要修改所有的地方来获取新的Logger,这将产生巨大的工作量。

而SFL4J,运用门面外观模式,提供一个接口,将不同的日志框架的使用统一起来。

图 SLF4J 的工作原理

2 Log4J

级别标准是:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATA < OFF。

|-------|-------------|-------|--------------------|
| ALL | 所有级别包括自定义级别 | WARN | 用于警告消息。 |
| TRACE | 低于DEBUG。 | ERROR | 错误消息日志,应用程序可以继续执行。 |
| DEBUG | 调试消息日志。 | FATA | 严重错误消息日志,必须中止运行程序。 |
| INFO | 信息消息。 | OFF | 最高级别,旨在关闭日志记录。 |

表 Log4j 日志级别说明

图 log4j的配置文档结构

配置文档主要有两个标签:<appender>用来配置日志输出目标的信息。<root>更节点来配置日志输出级别、输出目标等信息。

3 appender

log输出源,常用的输出源有:ConsoleAppender(控制台)、FileAppender(文件)、DailyRollingFileAppender(日常日志文件,FileAppender的子类)等。

这些输出源公有等配置选项有:

1、Threshold,指定日志信息的最低输出级别,默认DEBUG。

2、ImmediateFlush, 表示所有的消息都会被立即输出,默认true。

|--------------------------|------------------------------------------------------------------------------------------------------------------------------|
| ConsoleAppender | Target,输出流,默认是System.out。 |
| FileAppender | Append,表示增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。 File,当前消息输出的文件地址 |
| DailyRollingFileAppender | DatePattern,输出频率,yyy-MM 表示每月产生一个新的日志文件,命名规则是:文件名.后缀.yyyy-MM |
| RollingFileAppender | MaxFileSize,文件到达该大小时,将会自动产生一个新的日志文件,后缀可以是KB,MB或者GB。 MaxBackupIndex,可以产生的滚动文件最大数,假如设为2,则可产生app.log.1、app.log.2两个滚动文件和app.log。 |

表 常见输出源的相关配置

3.1 layout

配置日志信息的输出格式的布局。常见的布局有:HTMLLayout(以HTML表格形式布局)、PatternLayout(可以灵活指定布局模式)、SimpleLayout(包含日志信息的级别和信息字符串)、TTCCLayout(包含日志产生的时间、线程、类别等信息)。

|----|-----------------------------------------------------|----|---------------------------------------------|
| %p | 日志信息的优先级,即DEBUG、INFO、WARN等。 | %F | 产生日志消息所在的文件名称。 |
| %d | 输出日志的时间,其后可以指定格式,如:%d{yyyy-MM-dd HH:mm:ss}。 | %L | 代码中的行号。 |
| %r | 自应用程序启动到输出该log信息耗费到毫秒数。 | %m | 输出代码中指定的具体消息。比如log.warn("hello"); 则输出hello。 |
| %t | 产生该日志事件的线程名。 | %n | 一个回车换行符。 |
| %l | 日志事件发生位置,相当于%c.%M(%F:%L)的组合,包括类的全名、方法、文件名以及在代码中的行数。 | %x | 输出和当前线程相关联的NDC(嵌套诊断环境)。 |
| %c | 产生日志信息所属的类目。 | %% | 输出一个%字符。 |
| %M | 产生日志信息的方法名。 | | |

表 PatternLayout 布局格式化符号说明

例如:%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

输出:

2023-11-22 21:25:43 INFO Application:25 -- info

2023-11-22 21:25:43 WARN Application:26 -- warn

%-5 表示左对齐5个字符。

4 输出实战

log4j 日志可以输出到文件、邮件及数据库等。下面将大致介绍输出到邮件及文件到用法。

4.1 输出到邮件

首先,需要添加邮件发送的依赖:

<dependency>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

<version>1.4.7</version>

</dependency>

然后配置appender

图 邮件appender配置

bufferSize,默认单位是kb。是指日志超过该大小后才会发送邮件(当程序停止时也会发送邮件)。

图 log4j 发送的日志邮件

4.2 输出到文件

图 DailyRollingFileAppender C产生的日志文件

如图所示,所产生的日志文件并不符合我们的期望,我们想得到的文件是: app.yyyy-MM-dd-HH-mm.log 这种格式的。这时需要我们自定义Appender。

我们需要先分析DailyRollingFileAppender这个类:

产生日志文件是在rollOver()这个方法发生的(这个方法官方注释是:将当前文件滚动到新文件)。

图 DailyRollingFileAppender 类的rollOver方法

因为rollOver方法我们没法重写,我们的Appender类不能直接继承DailyRollingFileAppender类。我们重写CustomDailyRollingFileAppender类,并继承FileAppender。这个类相对于DailyRollingFileAppender,只需要修改两处:

图 修改activateOptions方法

图 修改rollOver方法

图 修改后生成的日志文件

相关推荐
古希腊掌管学习的神2 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师2 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
V+zmm101348 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
就爱学编程11 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
Oneforlove_twoforjob34 分钟前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji11111134 分钟前
前端对页面数据进行缓存
开发语言·前端·javascript
xmh-sxh-131436 分钟前
常用的缓存技术都有哪些
java
每天都要学信号1 小时前
Python(第一天)
开发语言·python
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论
生信圆桌1 小时前
【生信圆桌x教程系列】如何安装 seurat V5版本R包,最详细安装手册
开发语言·r语言