Log4j2使用ScriptFilter

Log4j使用ScriptFilter

引言

由于最近做log4j版本升级为2版本的,看了下配置这块,刚好项目中定时任务老刷日志,很烦!!!,想到通过配置将控制台中定时任务线程的日志给拦截掉,百度了下基本都是去继承AbstractFilter,我又不想新增了个类,看了下Log4j官方实现的Filter,决定用ScriptFilter来拦截掉指定线程日志(还可以更多diy)

相关配置

  <!--  控制台日志配置  -->
      <!--  控制台日志配置  -->
    <Appender type="Console" name="Stdout">
      <!--  脚本拦截器(判断是否输出定时任务日志,定时任务老刷日志很烦!!当前配置为不拦截,需要拦截请将注释放开 )    -->
      <ScriptFilter onMatch="DENY" onMisMatch="NEUTRAL">
        <Script name="TimerLogFilter" language="javascript">
          <![CDATA[
          var dd = logEvent.getThreadName().startsWith("Timer");
          dd;
         ]]>
        </Script>
      </ScriptFilter>
      <!--   指定日志输出格式   -->
      <Layout type="PatternLayout" pattern="[%t] [%-5p] %d{HH:mm:ss.SSS} %c %m %n"/>
    </Appender>

原理(看注释)

public final class ScriptFilter extends AbstractFilter {
    private static Logger logger = StatusLogger.getLogger();
    private final AbstractScript script;
    private final Configuration configuration;
	// 当ScriptFilter放在xml的Configuration节点下进这里,就可以用bindings的数据完成自己的需求啦
    public Result filter(final org.apache.logging.log4j.core.Logger logger, final Level level, final Marker marker, final String msg, final Object... params) {
        SimpleBindings bindings = new SimpleBindings();
        bindings.put("logger", logger);
        bindings.put("level", level);
        bindings.put("marker", marker);
        bindings.put("message", new SimpleMessage(msg));
        bindings.put("parameters", params);
        bindings.put("throwable", (Object)null);
        bindings.putAll(this.configuration.getProperties());
        bindings.put("substitutor", this.configuration.getStrSubstitutor());
        Object object = this.configuration.getScriptManager().execute(this.script.getName(), bindings);
        return object != null && Boolean.TRUE.equals(object) ? this.onMatch : this.onMismatch;
    }

	// 当ScriptFilter放在xml的Appender节点下进这里,就可以用bindings的数据完成自己的需求啦
    public Result filter(final LogEvent event) {
        SimpleBindings bindings = new SimpleBindings();
        bindings.put("logEvent", event);
        bindings.putAll(this.configuration.getProperties());
        bindings.put("substitutor", this.configuration.getStrSubstitutor());
        Object object = this.configuration.getScriptManager().execute(this.script.getName(), bindings);
        return object != null && Boolean.TRUE.equals(object) ? this.onMatch : this.onMismatch;
    }
}
posted @ 2022-01-25 18:10  无言呦  阅读(259)  评论(0编辑  收藏  举报