一、简介
Log4j
( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache
的一个开源项目, 为Java提供了日志记录功能。能够让程序员非常方便的记录日志, 并且提供了多种适配方式,能满足各种需求。
使用Log4j 只需要导入一个jar包,jar 下载地址。 Maven 坐标为:
<dependency>
<groupId>org.log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
二、Log4j 组成
Log4j 有三个主要组件——loggers、appender 和 layouts ——它们可以一起使用,以在所需的目的地打印自定义的日志语句。其中对应着下面三个部分:
- Level : 日志等级, 用于定义日志的重要程度
- Appender: 追加器, 用于定义日志的输出位置
- Layout: 布局, 用于定义日志的输出格式
1)Logger
Logger 对象负责展现日志记录信息。它是 Log4j 架构中的第一个必须层。Logger 类在包 org.apache.log4j 中定义。
通常,我们为每个应用类创建一个 Logger 实例来记录属于该类的重要事件。此外,我们通常使用接受类名作为参数的静态工厂方法在类的开头创建此实例:(与JUL类似)
private static final Logger logger = Logger.getLogger(JavaClass.class.getName());
Log4j 日志等级有:
off
: 关闭日志 , 最高等级, 任何日志都无法输出fatal
,: 灾难性错误, 在能够输出日志的所有等级中最高error
:错误, 一般用于异常信息warn
:警告, 一般用于不规范的引用等信息info
: 普通信息debug
: 调试信息, 一般用于程序执行过程trace
: 堆栈信息, 一般不使用all
: 打开所有日志, 最低等级, 所有日志都可使用
在 Logger 核心类中, 除了 off/all
以外, 其他每个日志等级都对应一组重载的方法, 用于记录不同等级的日志。
当且仅当 方法对应的日志等级 大于等于 设置的日志等级时, 日志才会被记录
2)Appender(追加器)
Appender 用于定义日志的输出位置, Log4j 提供了多种可供选择的追加器。常用追加器有
Appender的作用:
ConsoleAppender:将日志记录在控制台
FileAppender:将日志记录在文件中
RollingFileAppender:将日志记录在文件中, 当文件达到一定大小之后,会创建新文件
DailyRollingFileAppender:将日志记录在文件中, 每天一个备份文件
JDBCAppender:将日志记录在数据库表中
以上五个为常用Appender,完整列表为
当然, 如果觉得这些也不能满足你的需求, 你可以:
- 实现
Appender
接口implements Appender
- 继承
AppenderSkeleton
类 重写核心方法
3)Layout (布局)
Layout 用于定义输出日志的格式, 常用Layout 有
Layout的格式
SimpleLayout:简单格式, 格式为 日志等级 - 日志内容
TTCCLayout :Time,Thread,Category,Context
[线程] 日志等级 记录日志的类的包名.类名 - 日志内容
XMLLayout:以XML格式输出日志
HTMLLayout :以HTML文件格式输出日志
PatternLayout :灵活格式输出日志, 使用通配符自定义格式
以上五个为常用Layout ,完整列表为
三、Log4j 应用
1)简单demo
public static void main(String[] args) throws IOException {
// 获取日志记录器对象
Logger logger = Logger.getLogger(logDemo.class.getName());
// 日志记录输出
logger.info("hello log4j");
// 日志级别
logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行
logger.error("error"); // 错误信息,但不会影响系统运行
logger.warn("warn"); // 警告信息,可能会发生问题
logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等
logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
logger.trace("trace"); // 追踪信息,记录程序的所有流程信息
}
与JUL不同的是,JUL的logger对通过getLogger获取之后,可以直接默认输出日志,因为其默认继承RootLogger,但是Log4j不同,获取之后直接输出会报错,如下所示:
出现这个的原因是因为我们没有正确的初始化Log4j,需要添加一行初始化配置的代码:
// 初始化系统配置
BasicConfigurator.configure();
完整如下:
public static void main(String[] args) throws IOException {
// 初始化系统配置
BasicConfigurator.configure();
// 获取日志记录器对象
Logger logger = Logger.getLogger(logDemo.class.getName());
// 日志记录输出
logger.info("hello log4j");
// 日志级别
logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行
logger.error("error"); // 错误信息,但不会影响系统运行
logger.warn("warn"); // 警告信息,可能会发生问题
logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等
logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
logger.trace("trace"); // 追踪信息,记录程序的所有流程信息
}
这样就可以正常输出了。
2)简单使用配置文件
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 appender 为=console
log4j.rootLogger=trace,console
# 指定控制台日志输出的 appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
去掉刚才的配置代码:
日志输出:
3)常用配置文件
1.输出到控制台配置:
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=all,使用的 appender 为=console
log4j.rootLogger=all,console
#################
# 输出到控制台
#################
#console 控制台输出源
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 输出日志的格式(布局)实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.console.layout.conversionPattern=%d [%t] %-5p [%c\:%L] %m%n
# 输出日志的级别 不填则继承root的级别
log4j.appender.console.threshold=info
其实配置比较简单,需要着重说明一下的就是layout的输出格式,具体字符含义如下所示:
模式参数说明
%c: 输出日志的logger名, 即Logger.getLogger中的名字或全限定类名
%C: 输出日志消息产生时所在类的全限定类名
%d: 输出日志的时间格式, 默认格式为ISO8601(yyyy-MM-dd HH:mm:ss,SSS). 可在后面指定格式, 例如: %d{yyyy-MM-dd HH:mm:ss}
%F: 输出日志消息产生时所在的类文件名 (示例: LogTest.java)
%l: 输出日志的详细位置. 相当于%c.%M(%F:%L的组合), 示例: com.chenlongji.log4jstudy.controller.LogTest.testRolling(LogTest.java:24)
%L: 输出日志时所在的行数
%m: 输出日志的具体内容
%M: 输出日志所在类的方法名 (示例: testRolling)
%n: 输出当前系统的换行符
%p: 输出日志的级别
%r: 输出自日志程序启动到输出当前日志的耗时数. 没啥意义
%t: 输出日志产生的线程名
%x: 输出和当前线程相关联的NDC(嵌套诊断环境), 只能存储一个值
%X: 输出映射调试上下文信息, (使用map, 可以存储多个值). 常用于将traceId传递到日志中, 进行日志上下文搜索. 使用示例: tid=%X{traceId}, 花括号内表示要取出值的key
使用说明: 使用MDC跟踪日志_mdc日志_livel_java的博客-CSDN博客
%%: 输出一个%号
[num]: 阿拉伯数字, 表示输出的长度
示例 %5p, 表示输出日志级别, 占位为5, 多余长度补空格, 默认是右对齐
-[num]: 左对齐, 实际长度不足补空格, 实际长度超出也全显示
.[num]: 实际长度大于num会截掉左侧部分
所需的按照上面字符的配置即可。
2.输出到文件:
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=all,使用的 appender 为=console
log4j.rootLogger=all,logDailyFile,console
#################
# 输出到控制台
#################
#console 控制台输出源
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 输出日志的格式(布局)实现类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.console.layout.conversionPattern=[%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 输出日志的级别 不填则继承root的级别
log4j.appender.console.threshold=info
#################
# 输出到文件(RollingFileAppender类型)
#################
# 滚动文件输出源, 文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.logDailyFile=org.apache.log4j.RollingFileAppender
# 输出文件的路径 例如:./src/logs/clj2023.log
log4j.appender.logDailyFile.file=D://logs/info.log
# 文件最大容量(到达后创建新的文件), 默认值为10MB. 这里后缀可以为KB,MB,GB
log4j.appender.logDailyFile.maxFileSize=500MB
# 输出日志的格式(布局)实现类. 注: layout必须是小写
log4j.appender.logDailyFile.layout=org.apache.log4j.PatternLayout
# 输出日志的具体格式
log4j.appender.logDailyFile.layout.conversionPattern=%d [%t] %-5p [%c\:%L] %m%n
# 输出日志的级别 不填则理解为ALL级别
log4j.appender.logDailyFile.threshold=info
输出到文件的类型可选,按需即可。
以上就是常用的配置!具体配置细节可以在细查。
输出到数据库用的不多就省略了,需要可以自再查。
4)自定义Logger
# 自定义 logger 对象设置
log4j.logger.com.log.demo=info,file
# 日志文件输出的 appender 对象
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern=[%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file=c:/logs/log4j.log
自定义logger的是类路劲,如果某个单独的类需要自定义logger,就把自定义路径配置上去就行。
log4j应用场景已经没有太多了,所以就不过多描述,需要的话可以看下下面的详细讲解!