在写某个接口的时候想到的,如果不想开启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();
}
}
<?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>