当前文章只是学习笔记,具体请点击超链接:视频
Log4j是个老牌的日志框架,现在已经很少使用了。用得比较多的是logback和log4j2,因此,这篇文章也是作为日志系统入门资料,不会对Log4j运行原理做深入研究,只是简单使用,目的是了解日志框架的发展史。
官方介绍:Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4j,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
官方网站:http://logging.apache.org/log4j/1.2/
只需要引入Log4j依赖即可,这里使用单元测试跑代码比较方便,所以也引入Junit单元测试依赖
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
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");
}
}
但这次,控制台并没有输出日志信息。而是提示我们要进行配置。
这里,在代码中对日志进行基础配置。再次运行方法,可成功输出日志信息。
通过跟踪源码,可以找到配置文件的名称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主要由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