文章目录
    
    
    
    1. Java代码
   
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Test {
	static {
		//设置日志文件的文件名
		System.setProperty("LogFileName", "LogTest");
	}
	//初始化logger
	private static Logger logger = LogManager.getLogger();
	public static void main(String[] args) {
		logger.info("这是INFO级别的日志");
		logger.error("这是ERROR级别的日志");
	}
}
    
    
    2. Maven依赖
   
    在
    
     pom.xml
    
    文件中添加以下依赖:
   
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.17.2</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.17.2</version>
</dependency>
    
    
    3. log4j2.xml配置文件
   
    在
    
     src\main\resources
    
    文件夹下创建
    
     log4j2.xml
    
    文件,并根据实际需求修改配置项。
    
    以下为示例:
   
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
	<!-- 可以定义一些全局的配置,然后在其它地方进行引用 -->
	<Properties>
		<!-- 时间格式 -->
		<Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %m%n</Property>
		<!-- 日志文件路径 -->
		<Property name="logDir">logs</Property>
	</Properties>
	<Appenders>
		<!-- 输出至滚动文件 -->
		<RollingFile name="rolling_file"
			<!-- 此处是需要在Java程序中设置LogFileName -->
			fileName="${logDir}/${sys:LogFileName}.log"
			filePattern="${logDir}/${sys:LogFileName}_%d{yyyy-MM-dd}.log">
			<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout>
				<Pattern>${pattern}</Pattern>
			</PatternLayout>
			<!-- 按天存储日志 -->
			<Policies>
				<TimeBasedTriggeringPolicy interval="1"/>
			</Policies>
			<!-- 日志保留策略,保留10天 -->
			<DefaultRolloverStrategy max=10/>
			</RollingFile>
		<!-- 输出至控制台 -->
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
			<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
		</Console>
		<!-- 输出至文件 -->
		<File name="Filelog" fileName="${logDir}/test.log" append="false">
			<PatternLayout pattern="${pattern}"/>
		</File>
	</Appenders>
	<!-- 只有定义了loggers并引入的appender才会生效 -->
	<Loggers>
		<Root level="INFO">
			<appender-ref ref="rolling_file"/>
			<appender-ref ref="Console"/>
			<appender-ref ref="Filelog"/>
		</Root>
		<logger name="com.example.test" level="DEBUG" additivity="false">
			<appender-ref ref="rolling_file"/>
		</logger>
	</Loggers>
</Configuration>
    
    
    4. 配置项说明
   
    
    
    4.1
    
     <Configuration>
    
   
<Configuration>
- 
     
status
:设置log4j自身日志的输出等级 - 
     
monitorInterval
:用于指定log4j自动检测配置文件,并重新配置的间隔时间,单位是s,最小是5s 
    
    
    4.2
    
     <Properties>
    
   
<Properties>
可以定义一些全局的配置,然后在其它地方进行引用
    
    
    4.3
    
     <Appenders>
    
   
<Appenders>
    常见的子节点有3种:
    
     RollingFile
    
    、
    
     Console
    
    、
    
     File
    
    
    
    4.3.1
    
     RollingFile
    
   
RollingFile
    RollingFile根据
    
     时间周期
    
    或
    
     文件大小
    
    来滚动封闭旧的日志文件,并生成新的日志文件
   
- 
     
name
:appender的名字 - 
     
fileName
:当前日志文件存储的完整路径及文件名 - 
     
filePattern
:已封闭的日志文件存储的完整路径及文件名 - 
     
PatternLayout
:日志内容的格式,不设置默认为%m%n**(更多格式化参数见5.2)** - 
     
ThresholdFilter
:过滤方式**(更多用法见5.3)**
a.
level
:日志级别
b.
onMatch
:≥level的日志如何处理,一般为ACCEPT,表示记录
c.
onMismatch
:<level的日志如何处理,一般为DENY,表示不记录 - 
     
Policies
:滚动(rolling)策略,就是什么时候进行新建日志文件输出日志. - 
     
TimeBasedTriggeringPolicy
:Policies子节点,基于时间的滚动策略
a.
interval
:指定多久滚动一次,要和
filePattern
结合使用**(具体见5.4)**
b.
modulate
:调制起始时间方式**(具体见5.4)** - 
     
SizeBasedTriggeringPolicy
:Policies子节点,基于文件大小的滚动策略
a.
size
:指定日志文件的大小,超过此阈值后会滚动生成新文件 - 
     
DefaultRolloverStrategy
:指定日志文件存储路径下最多有多少个文件,当文件数超过
max
后,则从最旧的文件开始删除**(更详细的配置方法见5.5)**
a.
max
:如果不设置,则默认为7 
    
    
    4.3.2
    
     Console
    
   
Console
将日志输出至控制台
- 
     
name
:appender的名字 - 
     
target
:
SYSTEM_OUT
或
SYSTEM_ERR
 - 
     其它参数参考
RollingFile
 
    
    
    4.3.3
    
     File
    
   
File
- 
     
name
:appender的名字 - 
     
fileName
:日志文件存储的完整路径及文件名 - 
     
append
:默认为true,即在日志文件中追加日志内容;若设为false,则将覆盖日志内容 - 
     其它参数参考
RollingFile
 
    
    
    4.4
    
     <Loggers>
    
   
<Loggers>
常见的有2种:Root和Logger
- 
     
Root
节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
a.
level
:指定日志级别
b.
appender-ref
:指定该日志输出到哪个appender - 
     
Logger
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
a.
name
:用来指定该Logger所适用的类或者类所在的包全路径
b.
level
:指定日志级别
c.
appender-ref
:指定该日志输出到哪个Appender
d.
additivity
:是否继承Root节点,默认是true;若设为false,则只会在Logger的appender里输出,不会在Root的appender里输出 
    
    
    5. 其它说明
   
    
    
    5.1 日志级别
   
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
    
    
    5.2 日志格式化参数
   
# %m 输出代码中指定的消息   
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL   
# %r 输出自应用启动到输出该log信息耗费的毫秒数   
# %c 输出所属的类目,通常就是所在类的全名   
# %t 输出产生该日志事件的线程名   
# %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”   
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式   
#    如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921   
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数   
#    如:Testlog.main(TestLog.java:10)   
# %F 输出日志消息产生时所在的文件名称   
# %L 输出代码中的行号   
# %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中   
# %% 输出一个"%"字符   
#   
# 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:   
#  %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐   
#  %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格   
#  %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格   
#  %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边将超出的字符截掉
    
    
    5.3 日志级别过滤
   
# onMatch:≥level的日志如何处理
# onMismatch:<level的日志如何处理
# 参数:ACCEPT(记录),NEUTRAL(不处理),DENY(不记录)
# e.g.需要记录INFO到ERROR之间的日志,其他的不记录,可以通过设置2个过滤器实现:
# ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
																											
# 第1个过滤器,将大于等于INFO级别的日志不处理,小于INFO级别的日志不记录
<ThresholdFilter level="INFO" onMatch="NEUTRAL " onMismatch="DENY"/>
# 第2个过滤器,将大于等于FATAL级别的日志不记录,小于FATAL级别的日志记录
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="ACCEPT"/>
另一种实现方式:小于FATAL的不处理,其他的不记录;大于等于INFO的记录,其他的不记录
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    
    
    5.4
    
     RollingFile
    
    时间间隔
   
RollingFile
TimeBasedTriggeringPolicy中:
interval的单位由filePattern的最小时间决定
e.g. 当interval=1,filePattern为%d{yyyy-MM-dd}(最小时间为“天”),则间隔1天生成一个文件
e.g. 当interval=12,filePattern为%d{yyyy-MM-dd-HH}(最小时间为“小时”),则间隔12小时生成一个文件
modulate对滚动起始时间进行调制,为true时,从0点开始计算
e.g. 现在时间为3am,interval=4,modulate=true,则第一次滚动是在4am,接着是8am、12am...
e.g. 现在时间为3am,interval=4,modulate=false,则第一次滚动是在7am,接着是11am、3pm...
    
    
    5.5
    
     DefaultRolloverStrategy
    
    详细配置
   
DefaultRolloverStrategy
<DefaultRolloverStrategy>
	<Delete basePath="${logDir}/" maxDepth="1">
		<IfFileName glob="${sys:LogFileName}_*.log" />
		<IfLastModified age="30d" />
	</Delete>
</DefaultRolloverStrategy>
    
    
    6. 参考资料
   
    
     log4j2xml配置解析_timebasedtriggeringpolicy_独正己身的博客-CSDN博客
    
    
    
     log4j2配置文件log4j2.xml详解_log4j2 xml配置_tomorrow.hello的博客-CSDN博客
    
    
    
     Log4j_log4j monitorinterval_我不睡我要写代码的博客-CSDN博客
    
    
    
     log4j onMatch onMismatch_笔生花的博客-CSDN博客
    
    
    
     Log4J使用详解(整理)_log4j外带_馥钰的博客-CSDN博客
    
    
    
     Log4j2官方文档翻译、学习笔记之二——Appender的分类及常用类型示例_Star_Ship的博客-CSDN博客