【记录】log4j2日志xml配置项属性

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>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值