log4j2指定不同包的输出级别

首先引入这几个包

        <!-- 通用日志接口 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- jcl -> slf4j的替换器,某些第三方包可能使用的是jcl接口,这个包用于将jcl转到slf4j-->
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>jcl-over-slf4j</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--        </dependency>-->


        <!-- 日志桥接包, 2.11.1对应log4j2的版本 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.11.1</version>
        </dependency>

        <!-- log4j2的真正实现包,貌似这里不主动引入,log4j-slf4j-impl会自动将这个包引进来-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>

接着是配置文件log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
    status指定全局日志等级(可能会被loggers的root level覆盖)
-->
<Configuration status="warn" name="log4j2ConfigureXML">

    <Appenders>
        <!--
        定义标准输出的日志格式(SYSTEM_OUT)
        %d: 表示日期
        %level:表示日志级别,%-5level,表示5个占位符
        %t: 方法名
        %m: 消息体(即我们填的信息)
        %C: 包名 (%F: 类文件名,这里没加)
        %L: 行号

        ThresholdFilter过滤器,这里指定接受的日志级别,低于该级别的日志直接丢弃
        -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!--
            指定日志文件
        -->
        <File name="logfile" fileName="logs/all.log" append="true">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
        </File>

        <!--
            滚动更新,即当日志文件尺寸大于SizeBasedTriggeringPolicy size时,就新建一个filePattern指定命名格式的日志文件
            DefaultRolloverStrategy max指定最多新建日志文件的个数

            fileName指定的是最新的日志信息文件名
        -->
        <RollingFile name="rollingFile" fileName="logs/rolling.log"
                     filePattern="logs/rolling-%d{yyyy-MM-dd HH}--%i.log">
            <PatternLayout>
                <Pattern>%d [%-5level][%t] %m (%C:%L) %n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!-- 配置Zookeeper的文件日志Appender -->
        <File name="zkLogFile" fileName="logs/zk.log" append="true">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
        </File>

    </Appenders>


    <Loggers>

        <!-- 日志文件设置为warn级别 ,控制台打印info级别-->
        <logger name="MyLogger" >
            <AppenderRef ref="logfile" level="warn"/>
            <AppenderRef ref="rollingFile" level="warn"/>
            <AppenderRef ref="Console" level="info"/>
        </logger>

        <logger name="org.apache.zookeeper">
            <AppenderRef ref="zkLogFile" level="warn"/>
            <AppenderRef ref="Console" level="warn"/>
        </logger>

        <!--
            root level指定Appender的日志等级,root level会影响到上面logger的输出,当上面logger的日志级别低于root level时,
            就不会输出了,但是当root level低于上面的logger的日志级别时,将会按照上面的logger的level来输出
            AppenderRef ref引用上面定义的日志Appender

            总结一下:能影响到输出的有ThresholdFilter level,logger level, root level
            最终的输出级别是max{ThresholdFilter level,logger level, root level}
            eg:某个Appender的ThresholdFilter level为debug,引用该Appender的logger的level为info,全局的root level为trace,
            最终这个logger的输出级别就为三个level中最高的,即info
        -->
        <root level="debug">

        </root>

    </Loggers>

</Configuration>

这里是以Zookeeper和自己定义的MyLogger为例

public static Logger logger= LoggerFactory.getLogger("MyLogger");

分别配置控制台输出的级别和记录日志文件的级别,并且区分Zookeeper和MyLogger

此外关于几个level的关系:

            root level指定Appender的日志等级,root level会影响到上面logger的输出,当上面logger的日志级别低于root level时,
            就不会输出了,但是当root level低于上面的logger的日志级别时,将会按照上面的logger的level来输出

            总结一下:能影响到输出的有ThresholdFilter level,logger level, root level
            最终的输出级别是max{ThresholdFilter level,logger level, root level}
            eg:某个Appender的ThresholdFilter level为debug,引用该Appender的logger的level为info,全局的root level为trace,
            最终这个logger的输出级别就为三个level中最高的,即info

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值