• 细说log4j之log4j 2.x


    官网:https://logging.apache.org/log4j/2.x/

    1. 主要组件:


    从图中可以看出,log4j2中的主要组件为:FilterAppenderLogger,他们的层次关系为:
    Configuration
        -- Filter
        -- Appender - Layout
            -- Filter
        -- Logger
            -- Filter

    2. log4j 2.x配置
    log4j 2.x的配置文件格式和1.x的配置文件格式完全不同,需要特别注意。
    log4j 2.x从2.4版本开始支持properties配置文件,名称必须为:log4j2.properties。但是,对于log4j 2.x的配置,建议使用xml格式:log4j2.xml,各个组件配置非常灵活。
    log4j 2.x 配置框架:
    简洁模式:

    <?xml version="1.0" encoding="UTF-8"?>;
    <Configuration>
      <!-- 定义属性 -->
      <Properties>
        <Property name="name1">value</property>
        <Property name="name2" value="value2"/>
      </Properties>
    
      <!-- 定义全局过滤器 -->
      <filter ... />
    
      <!-- 定义日志输出源 -->
      <Appenders>
        <appender ... >
          <filter  ... />
        </appender>
        ...
      </Appenders>
     
      <!-- 定义日志 -->
      <Loggers>
        <Logger name="name1">
          <filter  ... />
        </Logger>
        ...
        <Root level="level">
          <AppenderRef ref="name"/>
        </Root>
      </Loggers>
    </Configuration>


    严格模式:

    <?xml version="1.0" encoding="UTF-8"?>;
    <Configuration>
      <Properties>
        <Property name="name1">value</property>
        <Property name="name2" value="value2"/>
      </Properties>
    
      <Filter type="type" ... />
     
      <Appenders>
        <Appender type="type" name="name">
          <Filter type="type" ... />
        </Appender>
        ...
      </Appenders>
    
      <Loggers>
        <Logger name="name1">
          <Filter type="type" ... />
        </Logger>
        ...
        <Root level="level">
          <AppenderRef ref="name"/>
        </Root>
      </Loggers>
    </Configuration>


    3. 详细配置示例
    分别以2种配置模式进行配置,如下:

    简洁模式:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN" monitorInterval="30">
        <!-- 简单模式配置log4j -->
        <!-- 输出源定义 -->
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            </Console>
        </Appenders>
        
        <!-- 日志 -->
        <Loggers>
            <!-- 特别指定包下的日志级别 -->
            <Logger name="org.chench.ttt" level="trace" additivity="false">
                <AppenderRef ref="Console" />
            </Logger>
        
            <Root level="info">
                <AppenderRef ref="Console" />
            </Root>
        </Loggers>
    </Configuration>

    严格模式:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 使用严格模式配置log4j2 -->
    <Configuration status="warn" strict="true" name="XMLConfigTest" packages="org.chench.test">
        <!-- 定义属性  -->
        <Properties>
            <Property name="fileName">target/test.log</Property>
        </Properties>
        
        <!-- 定义过滤器 -->
        <Filter type="ThresholdFilter" level="trace"/>
        
        <!-- 定义日志输出地 -->
        <Appenders>
            <!-- 输出到控制台 -->
            <Appender type="Console" name="STDOUT">
                <!-- <Layout type="PatternLayout" pattern="%m MDC%X%n"/> -->
                <Layout type="PatternLayout" pattern="%d [%t] %-5level %logger{36} - %msg%n"/>
                <!--
                <Filters>
                    <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL" />
                    <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>
                </Filters>
                -->
            </Appender>
            
            <!-- 输出到控制台 -->
            <Appender type="Console" name="Flow">
                <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/>
                <!--
                <Filters>
                    <Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                       <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
                </Filters>
                -->
            </Appender>
            
            <!-- 输出到文件 -->
            <Appender type="File" name="File" fileName="${fileName}">
                <Layout type="PatternLayout">
                    <!-- <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> -->
                    <!-- <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> -->
                    <Pattern>%d [%t] %-5level %logger{36} - %msg%n</Pattern>
                </Layout>
            </Appender>
            
            <!-- 输出到List -->
            <!-- <Appender type="List" name="List">
            </Appender> -->
        </Appenders>
        
        <!-- 具体日志组件 -->
        <Loggers>
            <!-- 定义org.chench.test.log4j包下的日志组件 -->
            <!-- 
            <Logger name="org.chench.test.log4j" level="debug" additivity="false">
                <Filter type="ThreadContextMapFilter">
                    <KeyValuePair key="test" value="123"/>
                </Filter>
                <AppenderRef ref="STDOUT" />
            </Logger>
            -->
            
            <!-- 定义包org.chench.ttt下的日志组件 -->
            <!--
            <Logger name="org.chench.ttt" level="debug" additivity="false">
                <AppenderRef ref="File"/>
            </Logger>
            -->
            
            <Root level="trace">
                <AppenderRef ref="STDOUT" />
                <AppenderRef ref="File" />
            </Root>
        </Loggers>
    </Configuration>


    4. 在Java中使用log4j2
    log4j2中获取日志组件的方式与log4j1不同,以传递class对象为例说明:

    log4j1: org.apache.log4j.Logger.getLogger(clazz)
    log4j2: org.apache.logging.log4j.LogManager.getLogger(clazz)

    代码片段:

    public class LoggerTest {
        private static final Logger logger = LogManager.getLogger(LoggerTest.class);
        public static void main(String[] args) {
            logger.info(String.format("log4j2 logger test"));
        }
    }

    log4j2日志输出格式详见:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

  • 相关阅读:
    Java集合框架——Map接口
    深入分析——HashSet是否真的无序?(JDK8)
    你这辈子最引以为傲的是什么?
    全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!
    Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系
    Spring Cloud Alibaba基础教程:Nacos的集群部署
    Spring Cloud Alibaba基础教程:Nacos的数据持久化
    Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置
    Spring Cloud Alibaba基础教程:Nacos配置的多环境管理
    Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
  • 原文地址:https://www.cnblogs.com/nuccch/p/6742974.html
Copyright © 2020-2023  润新知