xml示例:
<?xml version="1.0" encoding="UTF-8"?>
<!--
8个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出
设置为OFF 表示不记录log4j2本身的日志,
-->
<!-- status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 -->
<configuration status="WARN" monitorInterval="30">
<!-- 自己设置属性,后面通过${}来访问 -->
<properties>
<!--<property name="LOG_HOME">${web:rootDir}/logs</property>-->
<property name="LOG_HOME">/opt/logs</property>
<!--日志名称-->
<property name="LOG_NAME">user-service</property>
<!--日志格式-->
<property name="LOG_FORMAT">[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %t %c[%L] - %m %n</property>
<property name="LOG_FORMAT_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n%throwable</property>
<!--备份目录- 根据年月建立文件夹 -->
<property name="BACKUP_HOME">${LOG_HOME}/$${date:yyyy-MM}</property>
<!--备份频率-->
<property name="BACK_HZ">%d{yyyy-MM-dd}</property>
</properties>
<appenders>
<!--控制台日志-->
<console name="console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_FORMAT_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/>
</console>
<!--info级别日志输入到文件-->
<RollingFile name="infoLog" fileName="${LOG_HOME}/${LOG_NAME}-info.log"
filePattern="${BACKUP_HOME}/info/${LOG_NAME}-info-${BACK_HZ}-%i.log.gz">
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,
比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,
则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,
那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,
之后的封存时间依次为08:00,12:00,16:00-->
<TimeBasedTriggeringPolicy modulate="true" interval="4"/>
<SizeBasedTriggeringPolicy size="50 MB" />
</Policies>
<!-- 默认的文件大小处理策略,max表示filePattern配置的%i的最大值,即表示当天文件归档的最大数量 -->
<DefaultRolloverStrategy max="10">
<!-- 删除处理策略,在配置的路径中搜索,maxDepth表示往下搜索的最大深度 -->
<Delete basePath="${BACKUP_HOME}/info/" maxDepth="2">
<!-- 文件名搜索匹配,支持正则 -->
<IfFileName glob="${LOG_NAME}-info*.log.gz"/>
<!-- 最新修改时间超过7d则会被删除 -->
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
<!-- 只保存info日志 -->
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY" onMisMatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMisMatch="DENY"/>
</Filters>
</RollingFile>
<!--warn级别日志输入到文件-->
<RollingFile name="warnLog" fileName="${LOG_HOME}/${LOG_NAME}-warn.log"
filePattern="${BACKUP_HOME}/warn/${LOG_NAME}-warn-${BACK_HZ}-%i.log.gz">
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="4"/>
<SizeBasedTriggeringPolicy size="50 MB" />
</Policies>
<DefaultRolloverStrategy max="15">
<Delete basePath="${BACKUP_HOME}/warn/" maxDepth="1">
<IfFileName glob="${LOG_NAME}-warn*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
<!-- 只保存warn日志 -->
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY" onMisMatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMisMatch="DENY"/>
</Filters>
</RollingFile>
<!--error级别日志输入到文件-->
<RollingFile name="errorLog" fileName="${LOG_HOME}/${LOG_NAME}-error.log"
filePattern="${BACKUP_HOME}/error/${LOG_NAME}-error-${BACK_HZ}-%i.log.gz">
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="4"/>
<SizeBasedTriggeringPolicy size="50 MB" />
</Policies>
<DefaultRolloverStrategy max="15">
<Delete basePath="${BACKUP_HOME}/error/" maxDepth="1">
<IfFileName glob="${LOG_NAME}-error*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
<!-- 只保存error日志 -->
<ThresholdFilter level="ERROR"/>
</RollingFile>
<!-- RollingRandomAccessFile 与 RollingFile的主要区别在于性能: RandomAccessFileAppender始终
被缓冲,而FileAppender提供配置开关(bufferedIO).如果您想确保邮件在磁盘上(例如审核日志记录),则
两者都有一个"immediateFlush"配置选项.最后,RandomAccessFileAppender的默认缓冲区大小更大:256
* 1024字节,而FileAppender的默认缓冲区大小为8 * 1024字节(两个追加器的缓冲区大小都可以在配置
中设置).Log4j小组建议您使用RollingRandomAccessFile进行翻转,并避免使用unix logrotate实用程
序.显然FileAppender可以与logrotate结合使用-我们还没有听说过任何问题.-->
<RollingRandomAccessFile name="RFile" fileName="${LOG_HOME}/${LOG_NAME}-random.log"
filePattern="${LOG_HOME}/%d{yyyy-MM-dd}/${LOG_NAME}-%d{yyyy-MM-dd}_%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid [%15.15t] %-60.60logger{59} : %msg%n"/>
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<!-- 最多保存的文件个数 -->
<DefaultRolloverStrategy max="10">
<Delete basePath="${FilePath}" maxDepth="1">
<IfFileName glob="%d{yyyy-MM-dd}/*.log.gz" />
<IfLastModified age="5d" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</appenders>
<loggers>
<!--根日志配置-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="infoLog"/>
<appender-ref ref="warnLog"/>
<appender-ref ref="errorLog"/>
<appender-ref ref="RFile"/>
</root>
<logger name="com.alibaba.nacos.client.config.impl" level="warn"></logger>
<!--第三方日志配置-->
<!--<logger name="org.springframework" level="warn"/>
<logger name="org.springframework.boot.web" level="info"/>
<logger name="org.quartz" level="warn"/>
<logger name="org.mybatis" level="warn"/>-->
</loggers>
</configuration>
ConsoleAppender概述
Log4j2 ConsoleAppender将应用程序生成的日志事件附加到System.out或System.err中。 默认是System.err。
Console Appender使用用户在配置中使用PatternLayout属性指定的日志消息格式
target属性指定了日志消息的目标,即SYSTEM_OUT或SYSTEM_ERROR。
follow属性指示在初始化日志记录配置后,appender 是否应接受System.out或System.err的重新配置。
Properties:变量配置,类似常量定义
1. Console
用来定义输出到控制台的Appender,主要设置输出格式和level级别。
ThresholdFilter: 定义打印级别,onMismatch值设置是否拒绝其它。
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
pattern属性说明
%d{yyyy-MM-dd HH:mm:ss.SSS} ,表示输出到毫秒的时间
%t,输出当前线程名称
%-5level,输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger,输出logger名称,因为Root Logger没有名称,所以没有输出
%msg,日志文本
%n,换行
%F,输出所在的类文件名,如Client.java
%L,输出行号
%M,输出所在方法名
%l,输出语句所在的行数, 包括类名、方法名、文件名、行数
2. File
用来定义输出到指定位置的文件的Appender
FileAppender:servlet容器中的两个web应用程序可以拥有它们各自的配置,如果Log4j位于它们共同使用
的类加载器中,则可以安全地将日志写入同一个文件。默认启用bufferedIO以及immediateFlush(前者提高
性能,后者可以保证写入,缓冲区没满也写入!每次写操作都会调用flush,不过有点影响性能),如果是异
步Logger,即便 immediateFlush设置为false,异步Logger和appender也将在一批事件结束时自动flush,
这样做比较高效同时保证了数据写入磁盘 -
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用。->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
RandomAccessFile: 可以看作是FileAppender的进化版,实现上不大一样,根据报导,相比启用了bufferedIO的FileAppender性能提高了20-200%(RandomAccessFile没有bufferedIO 这个选项,因为它总是buffered的!)
<RandomAccessFile name="MyRandomAccessFile" fileName="logs/app.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
</RandomAccessFile>
3. RollingFile
用来定义超过指定条件自动删除旧的,创建新的Appender
RollingFileAppender:是一个OutputStreamAppender,它写入fileName参数中指定的文件,并根据TriggeringPolicy和RolloverPolicy将文件翻转。对于RollingFileAppender而言,这两个Policy都是必要的,TriggeringPolicy确定是否应该执行滚动,而RolloverStrategy定义如何执行滚动。
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!-- jvm重启就进行一次rollover-->
<OnStartupTriggeringPolicy />
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<!-- 文件大小达到10mb进行一次rollover -->
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<!-- DefaultRolloverStrategy,默认rollover策略。参数:
fileIndex有两个值,max和min,就是决定生成文件是从序号大的到序号小的,还是从序号小的到序号大。
min,计数器的起始值, 默认是1;max,计数器的最大值,默认是7。还有两个参数暂时不管。-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
RollingRandomAccessFileAppender: 可以视为RollingFileAppender的进化版,没有bufferedIO这个属性,对于RollingRandomAccessFile,缓存是固定开启的。fileName是实时写入的(未归档)文件名,filePattern则是归档文件的命名模式,因为开启了异步日志所以这里immediateFlush设置为false(不过好像不管它也无所谓),bufferSize缓冲区大小暂时默认,最后,TriggeringPolicy和RolloverStrategy是必须有的, 没有显示定义就会采用默认的。
<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/mylog.log"
immediateFlush="false" filePattern="logs/time-based-logs/%d{yyyy-MM-dd-hh-mm}.log.zip">
<!-- 生成的日志文件名要么按照时间来增长,filePattern中需要%d,
要么就以整数增长,filePattern中需要%i,又或者两个搭配(意义似乎不是很大
因为rollover一次计数器又从1开始了。。),文件名仅按照时间增长的话,
RolloverStrategy设置max,min参数似乎也没多什么意义了。-->
<!-- 如果filePattern以".gz", ".zip", ".bz2", ".deflate", ".pack200",或者".xz"结尾,
那么将使用与相对应的压缩方案压缩生成的归档文件。-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--决定是否应该执行rollover,只要有任何一个
policy返回true那么就进行rollover,rollover的
意思大概可以理解为:当日志文件满足特定条件时
将触发的事件,例如创建一个新的文件/把原有的文件
归档/删除等,具体怎样rollover由RolloverStrategy
决定 -->
<Policies>
<!-- jvm重启就进行一次rollover-->
<OnStartupTriggeringPolicy />
<!-- 文件大小达到20mb进行一次rollover -->
<SizeBasedTriggeringPolicy size="20 MB" />
<!-- TimeBasedTriggeringPolicy是最多用到的Policy,
interval默认值是1,根据filePattern中日期的最小单位,例如
在该配置里是mm(分钟),设置interval="2"则每隔两分钟将发生
一次rollover,按当前配置,具体表现就是隔两分钟得到一个log.zip。
modulate就是让第一次rollover发生在区间边界上(即便还没到
interval的时长),按照当前配置,首次rollover会发生在比如
8点50分0秒,这样之后的rollover就是8点52分0秒、8点54分0秒..
这样做的好处在于rollover的时机就变得很有规律很好预测,生成的
文件还很整齐(假设时间最小单位为天,interval="1",那么就
变成稳定每天0点自动rollover了。。)。还有个属性叫maxRandomDelay,
防止很多应用在同一时间一起rollover的,暂时不理它。
-->
<TimeBasedTriggeringPolicy interval="2" modulate="true" />
</Policies>
<DefaultRolloverStrategy/>
</RollingRandomAccessFile>
参数说明:
PatternLayout:输出格式,不设置默认为:%m%n.
filePattern : 指定当发生Rolling时,文件的转移和重命名规则,定义的日志文件后缀精确的时间决定了定期生成日志文件. 精确到dd, 即%d{yyyy-MM-dd},
则会每天生成一个文件, 精确到HH(%d{yyyy-MM-dd-HH}), 则会每时生成一个文件。
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。注意:这个只是控制某时间段内(根据配置不同)文件的数目,它并不会关心你的目录下一共有多少个日志文件了。
4. Loggers
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
参数说明:
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
5. Properties
变量配置,类似常量定义
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="更换为你的日志路径" />
<property name="FILE_NAME" value="更换为你的项目名" />
</Properties>