学习Java log:配置文件log4j2.xml的参数学习
xml部分原文:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" monitorInterval="60" strict="true">
<!-- 设置存放日志文件的路径 -->
<properties>
<property name="logpath">./logs</property>
</properties>
<appenders>
<!-- 控制器输出 -->
<Console name="console" target="SYSTEM_OUT">
<!-- 输出格式 -->
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %X{ip} %t %C %M %m %n"/>
</Console>
<!-- system.log -->
<RollingRandomAccessFile name="UFO.SYSTEM" immediateFlush="true" bufferSize="4096"
fileName="${logpath}/system.log"
filePattern="${logpath}/system.log.%d{yyyy-MM-dd-hh-mm}.zip"
ignoreExceptions="false">
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %X{ip} %t %C %M %m %n"/>
<Filters>
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${logpath}" maxDepth="2" followLinks="true">
<IfFileName glob="system.log.*.zip"/>
<IfLastModified age="10s"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
<!-- error.log -->
<RollingRandomAccessFile name="UFO.ERROR" immediateFlush="true" bufferSize="4096"
fileName="${logpath}/error.log"
filePattern="${logpath}/error.log.%d{yyyy-MM-dd}.zip"
ignoreExceptions="false">
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %X{ip} %t %C %M %m %n"/>
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<TimeBasedTriggeringPolicy/>
<DefaultRolloverStrategy>
<Delete basePath="${logpath}" maxDepth="2" followLinks="true">
<IfFileName glob="error.log.*.zip"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</appenders>
<loggers>
<Logger additivity="false" name="UFO.SYSTEM" level="INFO">
<AppenderRef ref="UFO.SYSTEM"/>
<AppenderRef ref="UFO.ERROR"/>
</Logger>
<!-- 根据具体需要添加需要打印的包的日志信息,这里主要关注tomcat以及zookeeper的日志 -->
<Logger additivity="false" name="org.apache" level="ERROR">
<AppenderRef ref="console"/>
</Logger>
<!--针对request以及response的信息配置输出级别-->
<Logger additivity="true" name="com.alibaba.dubbo.rpc.protocol.rest.support" level="INFO">
<AppenderRef ref="console"/>
</Logger>
<!-- 输出sql日志 -->
<Logger additivity="true" name="com.ufo.mapper" level="DEBUG" />
<!-- 设置根目录 -->
<Root level="INFO" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="UFO.SYSTEM"/>
<AppenderRef ref="UFO.ERROR"/>
</Root>
</loggers>
</configuration>
1.pattern的对应值
这里仅说明常用参数:
- %-d{yyyy-MM-dd HH:mm:ss.SSS} 设置日志记录的时间 {}中为时间格式
- %p 设置日志的级别:TRACE/DEBUG/INFO/WARN/ERROR
- %X{ip} 设置当前打印日志的ip
- %t 设置当前日志打印的线程的名称
- %C 设置当前打印的类的全路径名
- %M 设置当前打印的方法名
- %m 设置当前打印的消息
- %n 设置换行符
2.appender
- ConsoleAppender 控制台打印 对应标签<console>
- FileAppender以及RandomAccessFileAppender 输出到对应日志文件中 对应标签<File>和 <RandomAccessFile>
- RollingFileAppender以及RollingRandomAccessFileAppender 输出到对应日志文件中,并且进行滚动 对应标签<RollingFile> 和 <RollingRandomAccessFile>
3.RollingRandomAccessFileAppender参数说明
- name appender名称
- fileName 输出文件名称
- filePattern 输出格式
- immediateFlush 在日志有变化时是否立即刷新
- bufferSize 缓冲池大小,对于异步刷新这个字段似乎没有什么用
- ThresholdFilter标签:
-
level,表示最低接受的日志级别,博客配置的为INFO,即我们期望打印INFO级别以上的日志。
-
onMatch,表示当日志事件的日志级别与level一致时,应怎么做。一般为ACCEPT,表示接受。
-
onMismatch,表示日志事件的日志级别与level不一致时,应怎么做。一般为DENY,表示拒绝。也可以为NEUTRAL表示中立。
-
- Policies 策略:rollover(当日志文件满足特定条件时,将触发事件,例如创建一个新的文件/把原有的文件归档/删除等,具体操作由RolloverStrategy决定)
- OnStartupTriggeringPolicy jvm重启就进行一次rollover
- SizeBasedTriggeringPolicy size="10 MB" 文件大小达到10MB进行一次rollover
- TimeBasedTriggeringPolicy interval="2" modulate="true" 根据时间进行rollover,
- interval 时间的数量,时间的单位为filePattern的最小时间单位,上例中是到dd,即为天,则这里代表2天进行一次rollover;
- modulate 时间的固定偏移量,保证每次发生rollover的时候,都是在一个时间节点上(到0秒,比如说1天为单位,会在00:00:00时进行操作,如果以小时为单位,则会在固定小时点进行打包,比如12:00:00时操作等)
- CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true" 定时策略,使用cron表达式
- evaluateOnStartup:true,在TriggeringPolicy初始时评估是否需要补充一次归档;false,不检测
- CompositeTriggeringPolicy 组合了多个triggering policies,如果配置的策略中的任何一个返回true,则返回true。CompositeTriggeringPolicy简单的通过在policies元素包裹其他的policies来配置。
- Rollover策略,具体操作
- DefaultRolloverStrategy
- Delete 删除文件 basePath 文件路径 maxDepth目录深度(目前没什么感觉,1为当前目录,2为当前目录的子目录,以此类推)
- IfFileName标签 匹配文件名
- IfLastModified标签 匹配日志文件的保留时间:数字+D 天/H 小时/M 分钟/S 秒
- 默认是日志文件按文件名格式打包 max为最多保留日志包的数量
- Delete 删除文件 basePath 文件路径 maxDepth目录深度(目前没什么感觉,1为当前目录,2为当前目录的子目录,以此类推)
- DirectWriteRolloverStrategy 日志直接写入由文件模式表示的文件
- DefaultRolloverStrategy
4.Logger/root
- level 日志输出最低级别
- name 要打印日志的包路径(个人理解)如果为appender名称,则对应当前项目中所有用到logger的包;如果为包路径,则为指定包,输出指定包的日志
- additivity 是否在子appender的日志内容要不要在父appender中显示,true为要,false则子appender的内容仅在子appender的范围内显示(不是很清楚)
- appender-ref 关联的appender
5.后续
在一个maven工程中,是如何调用log4j2.xml进行操作的?
如果出现多个xml,调用顺序应该是怎样?
在使用disconf的前提下,为什么必须使用log4jDisconf的动态配置类才能正常打印日志,对于disconf来说,xml应仅有托管的作用,并不具备动态配置的作用?
一个log是如何打印出来的?
xml对应的properties的基本写法
log4j与logback slf4j等日志类的关系
参考文章链接:
https://blog.csdn.net/garfielder007/article/details/82874529
https://www.wandouip.com/t5i369144/
https://garssion.iteye.com/blog/2369929
https://blog.csdn.net/qq_33200504/article/details/78413438