Java 使用log4j2记录日志

13 篇文章 0 订阅

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种:RollingFileConsoleFile

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. targetSYSTEM_OUTSYSTEM_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.5DefaultRolloverStrategy详细配置

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值