spring boot log4j2 动态开关某个级别日志输出

825 阅读1分钟

在写某个接口的时候想到的,如果不想开启debug日志需要在xml 里面或者 yml里面去配置,要重新发布jar包。这样很麻烦。 能不能去动态开关一个enableDebug方法。在网上搜了很多,不过没有去外网搜,只能写个插件去实现了。 如果有朋友有更好的实现方式 不妨说一下哈。

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;

@Plugin(name = "LevelFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class LevelFilter extends AbstractFilter {
    //这里可以通过接口去设置为true 或者 false
    public static boolean enableDebug;

    @Override
    public Result filter(Logger logger, Level level, Marker marker, String msg, Object[] params) {
        return filter(level);
    }

    @Override
    public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(LogEvent event) {
        return filter(event.getLevel());
    }

    public Result filter(Level level) {
        if (level.equals(Level.DEBUG)) {
            if (isEnableDebug()) {
                return Result.ACCEPT;
            }
            return Result.DENY;
        }
        return Result.ACCEPT;
    }


    private boolean isEnableDebug() {
        return enableDebug;
    }

    @Override
    public String toString() {
        return "LevelFilter";
    }

    @PluginFactory
    public static LevelFilter createFilter() {
        return new LevelFilter();
    }
}

image.png

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" debug="false">
    <properties>
        <!-- 文件地址 -->
        <Property name="MAIN_PATTERN">%d %p [%t] %logger.%M - %m%n</Property>
        <Property name="LOG_HOME">D:\logs\web</Property>
    </properties>

    <Appenders>
        <!-- 全部级别文件 -->
        <RollingRandomAccessFile name="FILE_ALL"
                                 fileName="${LOG_HOME}${date:yyyy-MM-dd}\now.log"
                                 filePattern="${LOG_HOME}%d{yyyy-MM-dd}%d{yyyy-MM-dd HH}.log">
            <PatternLayout pattern="${MAIN_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        </RollingRandomAccessFile>

        <!-- error级别文件 -->
        <RollingRandomAccessFile name="FILE_ERROR"
                                 fileName="${LOG_HOME}${date:yyyy-MM-dd}\error\NOW_ERROR.log"
                                 filePattern="${LOG_HOME}%d{yyyy-MM-dd}\error%d{yyyy-MM-dd HH}_ERROR.log">
            <PatternLayout pattern="${MAIN_PATTERN}"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        </RollingRandomAccessFile>


        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${MAIN_PATTERN}"/>
            <!-- 启用级别过滤器 对应LevelFilter类-->
            <LevelFilter/>
        </Console>

    </Appenders>
    <Loggers>
       
        <Root level="DEBUG" includeLocation="true">
            <AppenderRef ref="FILE_ALL"/>
            <AppenderRef ref="FILE_ERROR"/>
            <AppenderRef ref="Console"/>
        </Root>

    </Loggers>
</Configuration>

重点看上面的

<Console name="Console" target="SYSTEM_OUT">
    <PatternLayout pattern="${MAIN_PATTERN}"/>
    <!-- 启用级别过滤器 对应LevelFilter类-->
    <LevelFilter/>
</Console>