如何在logback.xml中过滤特定的类记录器?

时间:2018-07-14 06:14:50

标签: logback graylog

我们尝试过滤从一个类生成的日志:

com.websudos.phantom

有两个目标:

  1. 应用程序中的所有日志都保存在文件中,但此校准日志中的日志除外

  2. 此文件中的所有日志均已传输到graylog。

我们使用此过滤器通过正则表达式过滤了这些日志:

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator>
        <matcher>
        <Name>parameter</Name>
        <regex>Executing query</regex>
    </matcher>
    <expression>parameter.matches(formattedMessage)</expression>
    </evaluator>
    <OnMismatch>DENY</OnMismatch>
    <OnMatch>ACCEPT</OnMatch>
</filter>

此类的Executing query正则表达式:com.websudos.phantom

并且我们不接受将此类的级别设置为OFF,因为我们需要将此日志传输到Graylog而不保存在文件中!

有什么解决方案?

2 个答案:

答案 0 :(得分:0)

这是一个解决方案:

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
    <expression>logger.equals("com.websudos.phantom")</expression>
  </evaluator>
  <OnMismatch>NEUTRAL</OnMismatch>
  <OnMatch>DENY</OnMatch>
</filter>

通过将此过滤器添加到任何appander,类com.websudos.phantom的日志将被忽略

答案 1 :(得分:0)

XML:

<filter class="com.websudos.loggers.ClassNameFilter">
    <className>com.websudos.phantom</className>
    <onMatch>ACCEPT</onMatch>
</filter>

Java:

package com.websudos.loggers;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;

public class ClassNameFilter extends AbstractMatcherFilter<ILoggingEvent> {

    String loggerName;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }

        if (event.getLoggerName().equals(loggerName)) {
            return onMatch;
        } else {
            return onMismatch;
        }
    }

    public void setClassName(String className) {
        this.loggerName = className;
    }

    @Override
    public void start() {
        if (this.loggerName != null) {
            super.start();
        }
    }
}

您可以轻松地对其进行足够的修改以检查日志记录级别。有关示例,请参见ch.qos.logback.classic.filter.LevelFilter