美文网首页
2019-09-26 LOG4J2配置方法

2019-09-26 LOG4J2配置方法

作者: 暖熊熊 | 来源:发表于2019-09-26 18:57 被阅读0次

    pom.xml文件

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    如果pom文件不配置排除,会报错,找到2个实现类

    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/C:/mavenrepo/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/C:/mavenrepo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    java.lang.StackOverflowError
    

    log4j2.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="INFO">
        <properties>
            <Property name="baseDir">logs</Property>
            <Property name="filename">logs/log.log</Property>
        </properties>
        <Appenders>
            <Console name="STDOUT" target="SYSTEM_OUT">
    
                <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss,SSS}-[%l]-[LOGID:%X{logid}]-[%p] %m%n"/>
            </Console>
    
            <RollingRandomAccessFile immediateFlush="true" name="RollingFile" fileName="${filename}"
                                     filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
                <PatternLayout>
                    <Pattern>%d %p [%t] %c %L %M - %msg%xEx%n</Pattern>
                </PatternLayout>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
                <DefaultRolloverStrategy max="999">
                    <Delete basePath="${baseDir}" maxDepth="2">
                        <IfFileName glob="*/app-*.log.gz"/>
                        <IfLastModified age="15d"/>
                    </Delete>
                </DefaultRolloverStrategy>
            </RollingRandomAccessFile>
        </Appenders>
        <Loggers>
    
            <!--没用logger具体指定级别,就默认是root的level-->
            <Root level="info">
                <AppenderRef ref="STDOUT"/>
                <AppenderRef ref="RollingFile"/>
            </Root>
    
            <!--写法一 如果用这种写法,就会使用Root的 AppenderRef-->
            <logger name="com.log.log.test" level="debug"/>
    
            <!--写法二 如果用这种写法,只要有additivity="false",就必须有AppenderRef,否则不输出内容-->
            <logger name="com.log.log.test" additivity="false" level="debug">
                <AppenderRef ref="STDOUT"/>
            </logger>
            <!--上面这俩种写法,都可以指定默认输出info日志,指定的包下面输出debug日志-->
        </Loggers>
    </Configuration>
    

    关于日志级别
    按照阿里巴巴的规约,提示
    info、debug、error都要判断日志级别再打印

    if (logger.isInfoEnabled()) {
        logger.info("info");
    }
    if (logger.isDebugEnabled()) {
        logger.debug("debug");
    }
    if (logger.isErrorEnabled()) {
        logger.error("error");
    }
    

    原因:如果打印的实参含有计算,不加logger.isDebugEnabled()的话也会进行计算,无辜消耗

    1. 打印日志的时候一定要想一下,定位问题的时候这行日志有没有用处
    2. 调用外部系统的时候一般要打印日志。
    3. 必须使用参数化信息的方式:
    logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol);
    

    相关文章

      网友评论

          本文标题:2019-09-26 LOG4J2配置方法

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