Фильтруйте сообщения Apache Spark Log4J, чтобы хранить только те, которые содержат конкретную строку - PullRequest
1 голос
/ 22 апреля 2019

У меня есть некоторый код, написанный на Java, который использует Apache Spark, и я хочу отключить все уровни сообщений журнала Log4j (ERROR, WARN и т. Д.) И сохранить только те уровни INFO, которые содержат определенную строку. Другими словами, у меня есть эти журналы:

19/04/21 19:09:40 INFO Instrumentation: [e10c0eb5] {"seed":26,"impurity":"entropy","featuresCol":"indexedFeatures","maxDepth":5,"labelCol":"indexedLabel","numTrees":10}
19/04/21 19:09:40 INFO Instrumentation: [752ad4c3] {"seed":26,"impurity":"entropy","featuresCol":"indexedFeatures","maxDepth":5,"labelCol":"indexedLabel","numTrees":12}
19/04/21 19:09:40 INFO Instrumentation: [d9d09329] {"seed":26,"impurity":"entropy","featuresCol":"indexedFeatures","maxDepth":5,"labelCol":"indexedLabel","numTrees":11}
19/04/21 19:09:40 INFO SparkContext: Starting job: take at DecisionTreeMetadata.scala:112
19/04/21 19:09:40 INFO SparkContext: Starting job: take at DecisionTreeMetadata.scala:112
19/04/21 19:09:40 INFO SparkContext: Starting job: take at DecisionTreeMetadata.scala:112
19/04/21 19:09:40 INFO DAGScheduler: Got job 5 (take at DecisionTreeMetadata.scala:112) with 1 output partitions
19/04/21 19:09:40 INFO DAGScheduler: Final stage: ResultStage 6 (take at DecisionTreeMetadata.scala:112)
19/04/21 19:09:40 INFO DAGScheduler: Parents of final stage: List()
19/04/21 19:09:40 INFO DAGScheduler: Missing parents: List()

Я хочу оставить только те, которые начинаются с "INFO Instrumentation". У меня есть этот пример кода:

    /*Logger.getLogger("org").setLevel(Level.OFF);
    Logger.getLogger("akka").setLevel(Level.OFF);*/








    SparkSession sparkSession = new SparkSession
            .Builder()
            .appName("Random Forest Classifier")
            .master("local[*]")
            .config("spark.ui.port", "40000")
            .getOrCreate();

Я хочу изменить первые две прокомментированные строки, чтобы применить мой фильтр, возможно ли это, и если да, то как это сделать ??

Я решил свою проблему; оказалось, что мне не нужен ни фильтр, ни аппендир; Я просто отключаю все журналы для "org" и "akka", затем я включаю только уровень INFO для этого класса: "org.apache.spark.ml.util", например:

    Logger.getLogger("org").setLevel(Level.OFF);
    Logger.getLogger("akka").setLevel(Level.OFF);


    Logger.getLogger("org.apache.spark.ml.util").setLevel(Level.INFO);

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете добавить фильтр в логгеры, в которых есть сообщения, которые вы хотите игнорировать.
Реализация фильтра отфильтрует сообщения, не соответствующие заданному предикату, такие как:

import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class MyLog4jFilter extends Filter {

    /**
     * Custom filter to only log INFO events with the 'Instrumentation:' prefix in their message
     */
    @Override
    public int decide(LoggingEvent event) {
        if(event.getLevel() == Level.INFO && event.getMessage().trim().startsWith("Instrumentation:"))
           return ACCEPT;
        else 
           return DENY;
    }

}

Ссылки:

...