目录标题
前言
当前文章只是学习笔记,具体请点击超链接:视频
简介
Log4j是个老牌的日志框架,现在已经很少使用了。用得比较多的是logback和log4j2,因此,这篇文章也是作为日志系统入门资料,不会对Log4j运行原理做深入研究,只是简单使用,目的是了解日志框架的发展史。
官方介绍:Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4j,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
官方网站:http://logging.apache.org/log4j/1.2/
使用
Maven依赖
只需要引入Log4j依赖即可,这里使用单元测试跑代码比较方便,所以也引入Junit单元测试依赖
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
快速测试代码
日志的使用方法和JUL日志一样,先利用类路径创建一个日志对象,然后输出日志信息。
package com.demo.log4j;
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
@Test
public void quickTest() {
// 创建Logger对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出info级别的日志信息
logger.info("info message");
}
}
但这次,控制台并没有输出日志信息。而是提示我们要进行配置。
这里,在代码中对日志进行基础配置。再次运行方法,可成功输出日志信息。
使用properties文件进行配置
通过跟踪源码,可以找到配置文件的名称log4j.properties。在resource目录下创建配置文件,并进行配置。
在log4j.properties文件中添加以下配置:
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
删掉BasiConfigurator.configure(),重新跑。
能输出日志信息说明配置生效:
开启内置日志
或者在properties文件中配置,key的名称可以进源码找到
Log4j组件
在进一步对日志组件进行配置之前,需要对Log4j的组件有个大概的了解。Log4J主要由Loggers(日志记录器)、Appenders(输出端)和Layout(日志格式化器)组成。其中,
Loggers 控制日志的输出级别与日志是否输出;
Appenders 指定日志的输出方式(输出到控制台、文件等);
Layout 控制日志信息的输出格式。
日志系统的自定义配置
自定义消息输出格式
常用的输出格式:
格式化器类型 | 作用 |
---|---|
HTMLLayout | Html格式输出 |
SimpleLayout | 简单的日志输出格式 |
PatternLayout | 可自定义格式 |
修改log4j.properties文件,采用PatternLayout自定义格式
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
测试代码:
@Test
public void quickTest() {
// 创建Logger对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出info级别的日志信息
logger.info("info message");
}
输出结果:
log4j.properties追加一行配置,修改输出日志的模板
log4j.appender.console.layout.ConversionPattern=%r [%t] %p %c %x - %m%n
再次运行代码,控制台输出结构为
其中%r [%t] %p %c %x - %m%n模板的占位符含义如下:
占位符 | 含义 |
---|---|
%m | 输出代码中指定的日志信息 |
%p | 输出优先级,及 DEBUG、INFO 等 |
%n | 换行符(Windows平台的换行符为 “\n”,Unix 平台为 “\n”) |
%r | 输出自应用启动到输出该 log 信息耗费的毫秒数 |
%c | 输出打印语句所属的类的全名 |
%t | 输出产生该日志的线程全名 |
%d | 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日HH:mm:ss} |
%l | 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10) |
%F | 输出日志消息产生时所在的文件名称 |
%L | 输出代码中的行号 |
%% | 输出一个 “%” 字符 |
自定义输出方式
输出日志到文件
在log4j.properties文件中追加文件方式输出的appender,日志保存路径为d:/logs/log4j.log,若文件不存在会自动创建。
# 指定控制台日志输出appender
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.file.file=d:/logs/log4j.log
# 文件相关设置
log4j.appender.file.encoding=UTF-8
并修改父元素的输出方式,使得同时支持控制台输出和文件输出
完整的log4j.properties文件配置:
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console,file
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%r [%t] %p %c %x - %m%n
# 指定控制台日志输出appender
log4j.appender.file=org.apache.log4j.FileAppender
# 指定消息格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.file.file=d:/logs/log4j.log
# 文件相关设置
log4j.appender.file.encoding=UTF-8
再次运行代码,可以看到日志已经输出到文件中
按文件大小拆分成多个文件存储
完整的log4j.properties文件配置:
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,rollingFile
# 按文件大小拆分的appender对象
# 指定控制台日志输出appender
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
# 指定消息格式
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.rollingFile.file=d:/logs/log4j-rolling.log
# 文件相关设置
log4j.appender.rollingFile.encoding=UTF-8
log4j.appender.rollingFile.maxFileSize=100kb
# 文件最大数量
log4j.appender.rollingFile.maxBackupIndex=10
修改测试代码:
@Test
public void quickTest() {
// 创建Logger对象
Logger logger = Logger.getLogger(Log4jTest.class);
for (int i = 0; i < 10000; i++) {
// 输出info级别的日志信息
logger.info("info message_" + i);
}
}
运行测试代码,可以看到已经生成多个文件。
按日期拆分成多个文件存储
完整的log4j.properties文件配置:
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,dailyFile
# 按文件大小拆分的appender对象
# 指定控制台日志输出appender
log4j.appender.dailyFile=org.apache.log4j.RollingFileAppender
# 指定消息格式
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
# 指定消息保存路径
log4j.appender.dailyFile.file=d:/logs/log4j-dailyFile.log
# 文件相关设置
log4j.appender.dailyFile.encoding=UTF-8
# 指定日期拆分规则,这里精确到秒。如果要按天拆分,value值为【'.'yyyy-MM-dd】
log4j.appender.rollingFile.datePattern='.'yyyy-MM-dd-HH-mm-ss
存储到数据库
(略)这里就不再演示,日志不会存储到类似于mysql的关系型数据库,因为受到底层数据结构的影响,mysql建议一张表最多存储500万条记录,超过了就要分库分表。日志数据属于海量数据,分分钟超500万,即使要存数据库,都是存MongoDB 等非关系型数据库。
参考资料:https://www.bilibili.com/video/BV1iJ411H74S