Loggers
Appenders
Layouts
日志输出格式说明:
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
Log4j提供了8个级别的日志输出
导包
import org.apache.log4j.Logger;
pom依赖
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
@Test
public void test01(){
//加载初始化配置
BasicConfigurator.configure();
//初始化源码,需要设置Appender(输出方式)和Layout(输出格式)
// public static void configure() {
// Logger root = Logger.getRootLogger();
// root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
// }
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
输出结果:
Connected to the target VM, address: '127.0.0.1:56633', transport: 'socket'
0 [main] FATAL com.xc.mylog.Log4jTest - fatal信息
2 [main] ERROR com.xc.mylog.Log4jTest - error信息
2 [main] WARN com.xc.mylog.Log4jTest - warn信息
2 [main] INFO com.xc.mylog.Log4jTest - info信息
2 [main] DEBUG com.xc.mylog.Log4jTest - debug信息
Disconnected from the target VM, address: '127.0.0.1:56633', transport: 'socket'
Process finished with exit code 0
由结果可知默认级别为debug
Loader.getResource(“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][2022-06-22 22:20:54,362][com.xc.mylog.Log4jTest.test02(Log4jTest.java:121)]fatal信息
[ERROR ][main][2022-06-22 22:20:54,364][com.xc.mylog.Log4jTest.test02(Log4jTest.java:122)]error信息
[WARN ][main][2022-06-22 22:20:54,364][com.xc.mylog.Log4jTest.test02(Log4jTest.java:123)]warn信息
[INFO ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:124)]info信息
[DEBUG ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:125)]debug信息
[TRACE ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:126)]trace信息
Process finished with exit code 0
@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 tbl_log(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL COMMENT '项目名称',
createTime varchar(255) DEFAULT NULL COMMENT '创建时间',
level varchar(255) DEFAULT NULL COMMENT '日志级别',
category varchar(255) DEFAULT NULL COMMENT '所在类的全路径',
fileName varchar(255) DEFAULT NULL COMMENT '文件名称',
message varchar(255) DEFAULT NULL COMMENT '日志消息',
PRIMARY KEY(id)
)
@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信息");
}
输出结果:
覆盖文件的策略是,按照时间来进行覆盖,原则就是保留新的,覆盖旧的
@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信息");
}
}
输出结果:
第一次执行:
@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信息");
}
当天日志都会记录在log4j.log里面,过完今天,则加日期后缀,而log4j.log又开始记录新的一天的日志