<?xml version='1.0' encoding='UTF-8' ?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status:用于设置log4j2自身内部日志的信息输出级别,默认是OFF,可以不设置,当设置成trace时,可以看到log4j2内部各种详细输出-->
<!--monitorInterval:间隔秒数,Log4j能够自动检测配置文件的变更和重新配置本身 -->
<configuration status="WARN" monitorInterval="30">
<properties>
<!-- 自定义一些常量,之后使用${变量名}引用 -->
<Property name="logPath">/Users/zxj/Documents/IdeaProjects/Logs/test.zxj.com</Property>
<Property name="logPattern"></Property>
<!--<Property name="logPath">/export/Logs/test.zxj.com</Property>-->
</properties>
<!--Appenders:定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]-->
<!--Appender可以理解为日志的输出目的地-->
<Appenders>
<!-- Console:控制台输出的配置 -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<!-- PatternLayout:输出日志的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}:%p %t %c.java:%L - %m%n" />
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</Console>
<!--File:同步输出日志到本地文件-->
<!-- append="false":根据其下日志策略,每次清空文件重新输入日志,可用于测试-->
<File name="debugFile" fileName="${logPath}/debug.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- RollingRandomAccessFile性能比RollingFile提升官网宣称是20-200% -->
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingRandomAccessFile name="infoFile" fileName="${logPath}/info.log"
filePattern="${logPath}/info.log.%d{yyyy-MM-dd}" append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}:%p %t %l - %m%n" />
<Filters>
<!--ThresholdFilter :日志输出过滤-->
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<!--level="info" :日志级别,onMatch="ACCEPT" :级别在info之上则接受,onMismatch="DENY" :级别在info之下则拒绝-->
<!--与logger、root中定义的日志级别相配合,相当于两个闸门,先判断logger、root的级别,符合了才会用到该filter中的level,此时再进行一次筛选-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
</Filters>
<!-- Policies :日志滚动策略-->
<Policies>
<!-- TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件,interval="6" : 自定义文件滚动时间间隔,每隔6小时产生新文件, modulate="true" : 产生文件是否以0点偏移时间,即6点,12点,18点,0点-->
<TimeBasedTriggeringPolicy modulate="true" interval="6" />
<!-- SizeBasedTriggeringPolicy :文件大小滚动策略-->
<!-- <SizeBasedTriggeringPolicy size="100 MB"/>
<CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true"/> -->
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20">
<Delete basePath="${logpath}" maxDepth="2" followLinks="true">
<IfFileName glob="info.log.*"/>
<!--只保留7天,超过则删除-->
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="errorFile" fileName="${logPath}/error.log"
filePattern="${logPath}/error.log.%d{yyyy-MM-dd}" append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}:%p %t %l - %m%n" />
<Filters>
<ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<!-- Policies :日志滚动策略-->
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件-->
<DefaultRolloverStrategy max="20">
<Delete basePath="${logpath}" maxDepth="2" followLinks="true">
<IfFileName glob="error.log.*"/>
<!--只保留7天,超过则删除-->
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<!--additivity="false"表示在该logger中输出的日志不会再延伸到父层logger。这里如果改为true,则会延伸到Root Logger,遵循Root Logger的配置也输出一次。-->
<!--additivity="false" : additivity设置事件是否在root logger输出,为了避免重复输出,可以在Logger 标签下设置additivity为”false”-->
<Logger name="errorLog" level="error" additivity="false">
<AppenderRef ref="errorFile" />
</Logger>
<!--Logger节点用来单独指定日志的形式,name为包路径,比如要为com.jd.inaction包下所有日志指定为INFO级别等。 -->
<Logger name="com.jd.inaction" level="info" additivity="false">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="infoFile" />
</Logger>
<!--AsyncLogger :异步日志,LOG4J有三种日志模式,全异步日志,混合模式,同步日志,性能从高到底,线程越多效率越高,也可以避免日志卡死线程情况发生-->
<!--<AsyncLogger name="AsyncLogger" level="info" includeLocation="true" additivity="false">-->
<!--<AppenderRef ref="CONSOLE" />-->
<!--<appender-ref ref="infoFile"/>-->
<!--</AsyncLogger>-->
<!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
<Root level="error">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="errorFile" />
</Root>
<!-- <Root level="all">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="debugFile" />
<AppenderRef ref="infoFile" />
<AppenderRef ref="errorFile" />
</Root> -->
</Loggers>
</configuration>
Console节点中的PatternLayout定义了输出日志时的格式:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数