美文网首页Java
log4j 2 使用以及配置

log4j 2 使用以及配置

作者: Vchar_Fred | 来源:发表于2019-02-14 21:21 被阅读0次

    一、添加maven依赖

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.11.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.1</version>
    </dependency>
    

    如果现有组件使用Log4j 1.x并且您希望将此日志记录路由到Log4j 2,则删除所有log4j 1.x依赖项并添加以下内容

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>2.11.1</version>
    </dependency>     
    

    如果现有组件使用Apache Commons Logging 1.x并且您希望将此日志记录路由到Log4j 2,则添加以下内容但不删除任何Commons Logging 1.x依赖项。

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.11.1</version>
    </dependency>
    

    如果现有组件使用SLF4J并且您希望将此日志记录路由到Log4j 2,则添加以下内容但不删除任何SLF4J依赖项

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.11.1</version>
    </dependency>
    

    如果现有组件使用Java Util Logging并且您希望将此日志记录路由到Log4j 2,则添加以下内容

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jul</artifactId>
        <version>2.11.1</version>
    </dependency>
    

    二、使用

    public class Demo {
    
        private static Logger logger = LogManager.getLogger(Demo.class);
        public static void main(String[] args){
            logger.trace("------trace---追踪级别,就是程序推进以下,一般不使用");
            logger.debug("------debug---调试级别");
            logger.info("-------info----普通级别");
            logger.warn("-------warn----警告级别");
            logger.error("------error---错误级别");
            logger.fatal("------fatal---严重级别,程序已经无法运行或应该停止的情况下");
        }
    }
    

    三、配置

    log4j2默认会在classpath目录下寻找log4j.json、log4j.jsn、log4j2.xml等名称的文件,如果都没有找到,则会按默认配置输出,也就是输出到控制台。

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="OFF">
    </Configuration>
    

    Configuration 节点

    • status 打印log4j自身的日志级别配置

         OFF 关闭
         输出日志级别 All < Trace < Debug < Info < Warn < Error < Fatal < OFF
      

    如:

    #关闭
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="OFF">
    </Configuration>   
    
    #输出日志
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="DEBUG">
    </Configuration>     
    
    • monitorInterval 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="ERROR" monitorInterval="20">
    ...
    </Configuration>   
    

    Appenders节点

    常见的有三种子节点:Console、RollingFile、File

    • Console节点用来定义输出到控制台的Appender.

        name:指定Appender的名字.
        target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
        PatternLayout:输出格式,不设置默认为:%m%n
      
    • File节点用来定义输出到指定位置的文件的Appender.

        name:指定Appender的名字.
        fileName:指定输出日志的目的文件带全路径的文件名.
        PatternLayout:输出格式,不设置默认为:%m%n.
      
    • RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

        name:指定Appender的名字.
        fileName:指定输出日志的目的文件带全路径的文件名.
        PatternLayout:输出格式,不设置默认为:%m%n.
        filePattern:指定新建日志文件的名称格式.
        Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
        TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.
        SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
        DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性),默认7个。
      

    Loggers节点

    常见的有两种:Root和Logger.

    • Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

        level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
        AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.   
      
    • Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

        level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
        name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
        AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。         
      

    四、配置示例

    以下示例输出INFO级别日志且到达指定大小后删除旧的的日志,ERROR级别日志按月归档分类

    <?xml version="1.0" encoding="UTF-8"?>
    <!--配置根节点Configuration信息
    status :打印log4j自身的日志级别;
             OFF 关闭
             输出日志级别 All < Trace < Debug < Info < Warn < Error < Fatal < OFF
    monitorInterval :用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
    -->
    <Configuration status="ERROR" monitorInterval="86400">
        <!-- 变量配置 -->
        <Properties>
            <!--输入路径-->
            <Property name="ROOT_PATH" value="./home/logs"/>
            <Property name="INFO_LOG_PATH" value="${ROOT_PATH}/info"/>
            <Property name="ERROR_LOG_PATH" value="${ROOT_PATH}/error"/>
    
            <!--输出日志的格式-->
            <Property name="Console_OUT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 类名:%logger{80} 方法名:%M:%L %msg%n"/>
            <Property name="File_OUT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{80}.%M:%L %msg%n"/>
        </Properties>
    
        <Appenders>
            <!--输出控制台的配置-->
            <Console name="Console" target="SYSTEM_OUT">
                <!--日志过滤:控制台只输出level(info)及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <!--输出日志的格式-->
                <PatternLayout pattern="${File_OUT_PATTERN}"/>
            </Console>
    
            <!--普通日志:每个日志1GB, 总共15个,大概保留15天的日志-->
            <RollingFile name="INFO_LOG" fileName="${INFO_LOG_PATH}/info.log" filePattern="${INFO_LOG_PATH}/oldInfoLogs/info-%i.log">
                <!--日志过滤:ERROR-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <!--输出日志的格式-->
                <PatternLayout pattern="${File_OUT_PATTERN}"/>
                <Policies>
                    <!--每个日志大小:1GB-->
                    <SizeBasedTriggeringPolicy size="10KB"/>
                </Policies>
                <!--限制日志个数:15-->
                <DefaultRolloverStrategy max="15"/>
            </RollingFile>
    
            <!--错误日志:按月归档-->
            <RollingFile name="ERROR_LOG" fileName="${ERROR_LOG_PATH}/error.log" filePattern="${ERROR_LOG_PATH}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
                <!--日志过滤:ERROR-->
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
                <!--输出日志的格式-->
                <PatternLayout pattern="${File_OUT_PATTERN}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <!--每个日志大小:500MB-->
                    <SizeBasedTriggeringPolicy size="500MB"/>
                </Policies>
                <!--限制日志个数:80,基本保证每天的错误日志能够存下来-->
                <DefaultRolloverStrategy max="80"/>
            </RollingFile>
        </Appenders>
    
        <Loggers>
            <!--指定某个包下的日志级别,同时受全局日志级别影响-->
            <Logger name="top.vchar.demo.log4j2.test" level="ERROR"/>
            <!--全局日志级别-->
            <Root level="INFO">
                <AppenderRef ref="Console"/>
                <AppenderRef ref="INFO_LOG"/>
                <AppenderRef ref="ERROR_LOG"/>
            </Root>
        </Loggers>
    </Configuration>
    

    测试示例

    package top.vchar.demo.log4j2;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    /**
     * <p> 使用样例 </p>
     *
     * @author vchar fred
     * @version 1.0
     * @create_date 2019/1/21 14:11
     */
    public class Demo {
    
        private static Logger logger = LogManager.getLogger(Demo.class);
    
        public static void main(String[] args) throws InterruptedException {
            int i=0;
            long s = System.currentTimeMillis();
            while (i++<100000){
                print();
            }
            System.out.println((System.currentTimeMillis()-s));
    
        }
    
        private static void print(){
            logger.trace("------trace---追踪级别,就是程序推进以下,一般不使用");
            logger.debug("------debug---调试级别");
            logger.info("-------info----普通级别");
            logger.warn("-------warn----警告级别");
            logger.error("------error---错误级别");
            logger.fatal("------fatal---严重级别,程序已经无法运行或应该停止的情况下");
            System.out.println("-------------------end--------------------------");
        }
    
    }               
    

    五、其他

    在web项目中,需要在web.xml文件中配置log4j2的配置文件路径;如下:

    <!--log4j2配置-->
      <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j2.xml</param-value>
      </context-param>      

    相关文章

      网友评论

        本文标题:log4j 2 使用以及配置

        本文链接:https://www.haomeiwen.com/subject/rdbyeqtx.html