Java 使用log4j2记录日志

  • Post author:
  • Post category:java




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>


  • status

    :设置log4j自身日志的输出等级

  • monitorInterval

    :用于指定log4j自动检测配置文件,并重新配置的间隔时间,单位是s,最小是5s



4.2

<Properties>

可以定义一些全局的配置,然后在其它地方进行引用



4.3

<Appenders>

常见的子节点有3种:

RollingFile



Console



File



4.3.1

RollingFile

RollingFile根据

时间周期



文件大小

来滚动封闭旧的日志文件,并生成新的日志文件


  1. name

    :appender的名字

  2. fileName

    :当前日志文件存储的完整路径及文件名

  3. filePattern

    :已封闭的日志文件存储的完整路径及文件名

  4. PatternLayout

    :日志内容的格式,不设置默认为%m%n**(更多格式化参数见5.2)**

  5. ThresholdFilter

    :过滤方式**(更多用法见5.3)**

    a.

    level

    :日志级别

    b.

    onMatch

    :≥level的日志如何处理,一般为ACCEPT,表示记录

    c.

    onMismatch

    :<level的日志如何处理,一般为DENY,表示不记录

  6. Policies

    :滚动(rolling)策略,就是什么时候进行新建日志文件输出日志.

  7. TimeBasedTriggeringPolicy

    :Policies子节点,基于时间的滚动策略

    a.

    interval

    :指定多久滚动一次,要和

    filePattern

    结合使用**(具体见5.4)**

    b.

    modulate

    :调制起始时间方式**(具体见5.4)**

  8. SizeBasedTriggeringPolicy

    :Policies子节点,基于文件大小的滚动策略

    a.

    size

    :指定日志文件的大小,超过此阈值后会滚动生成新文件

  9. DefaultRolloverStrategy

    :指定日志文件存储路径下最多有多少个文件,当文件数超过

    max

    后,则从最旧的文件开始删除**(更详细的配置方法见5.5)**

    a.

    max

    :如果不设置,则默认为7



4.3.2

Console

将日志输出至控制台


  1. name

    :appender的名字

  2. target



    SYSTEM_OUT



    SYSTEM_ERR
  3. 其它参数参考

    RollingFile



4.3.3

File


  1. name

    :appender的名字

  2. fileName

    :日志文件存储的完整路径及文件名

  3. append

    :默认为true,即在日志文件中追加日志内容;若设为false,则将覆盖日志内容
  4. 其它参数参考

    RollingFile



4.4

<Loggers>

常见的有2种:Root和Logger


  1. Root

    节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

    a.

    level

    :指定日志级别

    b.

    appender-ref

    :指定该日志输出到哪个appender

  2. 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

时间间隔

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>
	<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博客



版权声明:本文为michael_f2008原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。