Apache
的一个开源项目控制台
、文件
、甚至是数据库
中配置文件
来灵活地进行配置,而不需要修改应用的代码是否输出
输出方式
(输出到控制台、文件等)输出格式
全限定名
,如com.xc.log4j.XXConsoleAppender
:将日志输出到控制台
FileAppender
:将日志输出到文件中
DailyRollingFileAppender
:将日志输出到一个日志文件,并且每天
输出到一个新的文件RollingFileAppender
:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小
达到指定尺寸时,会自动把文件改名,同时产生一个新的文件JDBCAppender
:把日志信息保存到数据库
中HTMLLayout
:格式化日志输出为HTML表格形式SimpleLayout
:简单的日志输出格式化,打印的日志格式如默认INFO级别的消息PatternLayout
:最强大的格式化组件,有默认的转换格式,也可以自定义格式输出日志日志输出格式说明
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式
%5c
:输出category名称,最小宽度
是5,category<5,默认的情况下右对齐
%-5c
:输出category名称,最小宽度
是5,category<5,"-"号指定左对齐
,会有空格%.5c
:输出category名称,最大宽度
是5,category>5,就会将左边多出的字符截掉,<5不会有空格%20.30c
:category名称<20补空格,并且右对齐,>30字符,就从左边较远处多出的字符截掉pom依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
@Test
public void test01() {
// 加载初始化配置(没有配置文件则需要添加此配置)
BasicConfigurator.configure();
// 实例化Logger
Logger logger = Logger.getLogger(Log4jTest.class);
logger.info("logger实例名称:" + logger.getName());
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
输出结果:
0 [main] INFO com.xc.log.Log4jTest - logger实例名称:com.xc.log.Log4jTest
1 [main] FATAL com.xc.log.Log4jTest - fatal信息
1 [main] ERROR com.xc.log.Log4jTest - error信息
1 [main] WARN com.xc.log.Log4jTest - warn信息
1 [main] INFO com.xc.log.Log4jTest - info信息
1 [main] DEBUG com.xc.log.Log4jTest - debug信息
Log4j提供了8个级别的日志输出
所有级别
的日志记录追踪
信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的调试
应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息(默认级别)运行
信息警告
,程序在运行过程中会出现的有可能会发生的隐形的错误错误
信息,发生的错误不影响系统的运行 一般情况下,如果不想输出太多的日志,则使用该级别即可严重错误
,它是那种一旦发生系统就不可能继续运行的严重错误关闭所有
的日志记录Loader.getResource("log4j.properties")
;源码默认从类路径
找resources目录下的log4j.properties文件
@Test
public void test02(){
//自定义配置文件设置Appender(输出方式)和Layout(输出格式)
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
[FATAL ] [main] [2024-09-19 22:38:55:822] [com.xc.log.Log4jTest.test01(Log4jTest.java:18)] fatal信息
[ERROR ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:19)] error信息
[WARN ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:20)] warn信息
[INFO ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:21)] info信息
resources目录下的log4j.properties文件
@Test
public void test03(){
//输出到文件对于追加,默认是true
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
创建表结构:(字段的制定可以根据需求进行调整)
CREATE TABLE `log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`project_name` varchar(255) DEFAULT NULL COMMENT '目项名',
`create_date` varchar(255) DEFAULT NULL COMMENT '创建时间',
`level` varchar(255) DEFAULT NULL COMMENT '优先级',
`category` varchar(255) DEFAULT NULL COMMENT '所在类的全名',
`file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ',
`thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名',
`line` varchar(255) DEFAULT NULL COMMENT '号行',
`all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置',
`message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息',
PRIMARY KEY (`log_id`)
);
resources目录下的log4j.properties文件
@Test
public void test04(){
//将日志持久化到数据库表中
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
resources目录下的log4j.properties文件
@Test
public void test05(){
Logger logger = Logger.getLogger(Log4jTest.class);
for (int i = 0; i < 10000; i++) {
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
第一次执行
第二次执行
45中剩余的就是01的内容
最新
的内容覆盖最旧
的内容resources目录下的log4j.properties文件
@Test
public void test05(){
//根据日期拆分
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
天
拆分,也可以根据小时,分钟拆分自定义logger
,让其他logger来继承这个logger输出位置
是不同的,则取二者的并集
,配置的位置都会进行输出操作日志级别
不同,以按照我们自定的logger
的级别输出为主