1、简单介绍
Log4j(Log for java)是 Apache 的一个开源项目,通过使用 Log4j,可以控制日志信息输送的目的地是控制台或文件等,也可以控制每一条日志的输出格式。通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。使用 Log4j 技术,主要使用的是其配置文件。
2、组件介绍
2.1、记录器-Loggers
Loggers(记录器)控制日志的输出级别,规则是:只输出级别不低于设定级别的日志信息。
级别由低到高
- all:打开所有日志记录开关;是最低等级的
- TRACE:输出追踪信息;一般情况下并不会使用
- DEBUG(默认):输出调试信息;打印些重要的运行信息
- INFO:输出提示信息;突出应用程序运行过程
- WARN:输出警告信息;会出现潜在错误的情况
- ERROR:输出错误信息;不影响系统的继续运行
- FATAL:输出致命错误;会导致应用程序的退出
- OFF:关闭所有日志记录开关;是最高等级的
2.2、输出器-Appender
Appender(输出器) 通常只负责将日志信息写入目标目的地。将格式化日志信息的责任委托给 Layout(格式器)。定义一个名字以便被 Loggers(记录器)引用。
- ConsoleAppender(控制台输出器):将日志信息输出到控制台
- FileAppender(文件输出器):将日志信息写入指定文件
- DailyRollingFileAppender(按天拆分文件输出器):将日志信息写入指定文件,每天一个新文件
- RollingFileAppender(拆分文件输出器):将日志信息写入多个文件(按照大小)
- JDBCAppender(数据库输出器):将日志信息写入数据库表(可以将日志信息持久化)
2.3、格式器-Layout
Layout(格式器)接收 Appender(输出器)的日志信息将其格式化为满足任何消费日志事件需求的样式。
- SimpleLayout(简单格式器):将日志信息输出为简单格式,默认为 INFO 级别的消息
- PatternLayout(自定义格式器):根据自定义的转换模式,返回格式化后的日志信息结果
PatternLayout详解:
3、配置文件
配置说明:
log4j.rootLogger=日志级别,引用输出器
log4j.appender.自定义输出控制器名称=输出方式
log4j.appender.自定义输出控制器名称.layout=输出格式
示列:创建log4j.properties
#配置日志级别,引用输出器
log4j.rootLogger=INFO,con
#配置控制台输出器
log4j.appender.con=org.apache.log4j.ConsoleAppender
#配置简单格式器
log4j.appender.con.layout=org.apache.log4j.SimpleLayout
代码:
@Test
public void test02() {
// 已有配置文件,无需再加载初始化配置
//BasicConfigurator.configure();
Logger logger = Logger.getLogger(Log4jTest.class);
logger.trace("trace信息");
logger.debug("debug信息");
logger.info("info信息");
logger.warn("warn信息");
logger.error("error信息");
logger.fatal("fatal信息");
}
输出结果:
INFO - info信息
WARN - warn信息
ERROR - error信息
FATAL - fatal信息
修改输出格式:PatternLayout
#配置日志级别,引用输出器
log4j.rootLogger=INFO,con
########## 控制台输出器 ##########
#配置控制台输出器
log4j.appender.con=org.apache.log4j.ConsoleAppender
#配置自定义格式器
log4j.appender.con.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.con.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c] %M %L %m%n
输出结果:和上面不一样了就
[2023-06-04 17:09:11.586] [INFO ] [main] [0 ms] [com.xb.Log4jTest] test02 37 info信息
[2023-06-04 17:09:11.589] [WARN ] [main] [3 ms] [com.xb.Log4jTest] test02 38 warn信息
[2023-06-04 17:09:11.589] [ERROR] [main] [3 ms] [com.xb.Log4jTest] test02 39 error信息
[2023-06-04 17:09:11.589] [FATAL] [main] [3 ms] [com.xb.Log4jTest] test02 40 fatal信息
4、日志信息写入文件及保存
修改配置:
#配置日志级别,引用输出器
log4j.rootLogger=INFO,myFile
########## 文件输出器 ##########
#配置控制台输出器
log4j.appender.myFile=org.apache.log4j.FileAppender
#配置自定义格式器
log4j.appender.myFile.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.myFile.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c] %M %L %m%n
#配置保存位置
log4j.appender.myFile.file=./src/logDir/file.log
#配置字符集编码
log4j.appender.myFile.encoding=UTF-8
问题:日志太多不方便管理,使用子类来管理,就是前面的那对应appender
按照文件大小拆分保存,相关配置:
########## 文件大小输出器 ##########
#配置控制台输出器
log4j.appender.roFile=org.apache.log4j.RollingFileAppender
#配置自定义格式器
log4j.appender.roFile.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.roFile.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c] %M %L %m%n
#配置保存位置
log4j.appender.roFile.file=./src/logDir/roFile.log
#配置字符集编码
log4j.appender.roFile.encoding=UTF-8
#配置文件大小
log4j.appender.roFile.maxFileSize=1kb
#配置拆分文件数量
log4j.appender.roFile.maxBackupIndex=2
#若文件大小超过1KB,则生成另外一个文件,数量最多2个。
#若2个文件不够用,则按照时间来进行覆盖,保留新的覆盖旧的。
按照时间进行拆分保存,相关配置:
########## 时间输出器 DailyRollingFileAppender##########
#配置控制台输出器
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
#配置自定义格式器
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.dailyFile.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c] %M %L %m%n
#配置保存位置
log4j.appender.dailyFile.file=./src/logDir/dailyFile.log
#配置字符集编码
log4j.appender.dailyFile.encoding=UTF-8
#配置日期格式
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd
保存如数据库,相关配置:
首先创建好表,然后根据表修改配置文件:
#配置日志级别,输出控制器
log4j.rootLogger=INFO,db
########## 数据库输出器 ##########
#配置数据库输出器
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
#配置自定义格式器
log4j.appender.db.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.db.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c] %M %L %m%n
#配置数据库
log4j.appender.db.URL=jdbc:mysql://localhost:3306/test
log4j.appender.db.Driver=com.mysql.cj.jdbc.Driver
log4j.appender.db.User=用户名
log4j.appender.db.Password=密码
log4j.appender.db.Sql=insert into log4j (name, createTime, level, thread, className, method, lineNumber, message) \
values ('log', '%d{yyyy-MM-dd HH:mm:ss.SSS}', '%p', '%t', '%c', '%M', '%L', '%m');
自定义logger:
从输出位置来看:控制台输出了信息,日志文件也输出了信息。所以可以得出结论,如果根节点的logger和自定义父logger配置的输出位置是不同的则取二者的并集,配置的位置都会进行输出操作。
从级别来看:以自定义的父logger级别输出为主