log4j2配置詳解


據網上博客整理,再加上自己一些理解。
參考:
https://www.cnblogs.com/sa-dan/p/6837225.html
https://www.jianshu.com/p/d13c2e50a89c

<?xml version="1.0" encoding="UTF-8"?>
<!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status="WARN" :用於設置log4j2自身內部日志的信息輸出級別,默認是OFF-->
<!--monitorInterval="30"  :間隔秒數,自動檢測配置文件的變更和重新配置本身-->
<configuration status="warn" monitorInterval="60" strict="true">
  <properties>
	<!--自定義一些常量,之后使用${變量名}引用-->
    <property name="logpath">./logs</property>
    <property name="charset">UTF-8</property>
	<!--自定義的輸出格式-->
    <property name="pattern">%-d{yyyy-MM-dd HH:mm:ss.SSS}@@%p@@%X{ip}@@%t %C@@%X{requestId} %M %m %n </property>
  </properties>
  <!--appenders:定義輸出內容,輸出格式,輸出方式,日志保存策略等,常用其下三種標簽[console,File,RollingFile]-->
  <!--Appender可以理解為日志的輸出目的地-->
  <appenders>
    <!--console :控制台輸出的配置-->
    <Console name="console" target="SYSTEM_OUT">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
    </Console>
	<!--RollingRandomAccessFile性能比RollingFile提升官網宣稱是20-200%-->
    <RollingRandomAccessFile name="YZY.TRACE" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/trace.log"
      filePattern="${logpath}/trace.log.%d{yyyy-MM-dd}.gz">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="trace.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.SYSTEM" immediateFlush="true" bufferSize="4096"
      fileName="${logpath}/system.log"
      filePattern="${logpath}/system.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
	  <!--引用上面自定義的輸出格式-->
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
		<!--ThresholdFilter :日志輸出過濾-->
        <!--level="info" :日志級別,onMatch="ACCEPT" :級別在info之上則接受,onMismatch="DENY" :級別在info之下則拒絕-->
        <!--與logger、root中定義的日志級別相配合,相當於兩個閘門,先判斷logger、root的級別,符合了才會用到該filter中的level,此時再進行一次篩選-->
        <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
        <!--<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>-->
        <!--<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->
      </Filters>
	  <!-- Policies :日志滾動策略-->
      <Policies>
        <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->
        <CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true"/>
      </Policies>
	  <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件-->
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="system.log.*.gz"/>
	  <!--只保留7天,超過則刪除-->
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.ERROR" immediateFlush="true" bufferSize="4096"
      fileName="${logpath}/error.log"
      filePattern="${logpath}/error.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="error.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.AUDIT" immediateFlush="false" bufferSize="8192"
      fileName="${logpath}/audit.log"
      filePattern="${logpath}/audit.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
        <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="audit.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.POOL" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/pool.log"
      filePattern="${logpath}/pool.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="pool.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.MONITOR" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/monitor.log"
      filePattern="${logpath}/pool.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="pool.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.BIZ" immediateFlush="true"
      fileName="${logpath}/biz.log"
      filePattern="${logpath}/biz.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="biz.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
  </appenders>
  
  <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效-->
  <loggers>
	<!--additivity="false"表示在該logger中輸出的日志不會再延伸到父層logger。這里如果改為true,則會延伸到Root Logger,遵循Root Logger的配置也輸出一次。-->
    <Logger additivity="false" name="YZY.TRACE" level="INFO">
      <AppenderRef ref="YZY.TRACE"/>
    </Logger>
    <Logger additivity="false" name="YZY.SYSTEM" level="INFO">
      <AppenderRef ref="YZY.SYSTEM"/>
      <AppenderRef ref="YZY.ERROR"/>
    </Logger>
    <Logger additivity="false" name="YZY.BIZ" level="INFO">
      <AppenderRef ref="YZY.BIZ"/>
    </Logger>
    <!--Logger節點用來單獨指定日志的形式,name為包路徑,比如要為org.apache包下所有日志指定為INFO級別等。 -->
    <Logger additivity="false" name="org.apache" level="INFO">
      <AppenderRef ref="console"/>
    </Logger>
    <Logger additivity="false"
      name="com.alibaba.dubbo.common.threadpool.monitor.MonitorPoolRunnable" level="INFO">
      <AppenderRef ref="YZY.POOL"/>
    </Logger>
    <Logger additivity="false" name="com.alibaba.dubbo.monitor.dubbo.sfextend.SfMonitorExtend"
      level="INFO">
      <AppenderRef ref="YZY.MONITOR"/>
    </Logger>
    <!--針對,request以及reponse的信息配置輸出級別,生產線請配置為error-->
    <Logger additivity="true" name="com.alibaba.dubbo.rpc.protocol.rest.support" level="INFO">
      <AppenderRef ref="console"/>
    </Logger>
    <!-- 在開發和測試環境啟用,輸出sql -->
    <Logger additivity="true" name="com.YZY.mapper" level="DEBUG">
    </Logger>
	<!-- Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出 -->
    <Root level="DEBUG" includeLocation="true">
      <AppenderRef ref="console"/>
      <AppenderRef ref="YZY.SYSTEM"/>
      <AppenderRef ref="YZY.ERROR"/>
      <AppenderRef ref="YZY.AUDIT"/>
    </Root>
  </loggers>
</configuration>
public class TestLog {

    public static void main(String[] args) {

        Logger logger = LoggerFactory.getLogger("YZY.SYSTEM");
        //Logger logger = LoggerFactory.getLogger(TestLog.class);

        logger.trace("trace level");
        logger.debug("debug level");
        logger.info("info level");
        logger.warn("warn level");
        logger.error("error level");
    }
}

RollingRandomAccessFile性能比RollingFile提高很多。
另https://www.cnblogs.com/sa-dan/p/6837225.html解釋了 name屬性的用法。
即可以在程序中使用Logger logger = LoggerFactory.getLogger("YZY.SYSTEM");來獲取對應的logger,如果找到對應名稱的logger,就不會使用root節點的logger。
LoggerFactory.getLogger(TestLog.class)底層實現也是調用的getLogger(clazz.getName());
如上代碼,LoggerFactory.getLogger(TestLog.class)找不到對應的logger,會使用默認的root節點的配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM