java - 过滤 Apache Spark Log4J 消息以仅保留包含特定字符串的消息
问题描述
我有一些使用 Apache Spark 用 Java 编写的代码,我想禁用所有 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);
谢谢你的帮助。
解决方案
您可以向包含您希望忽略的消息的记录器添加过滤器。
过滤器实现将过滤掉不符合给定谓词的消息,例如:
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;
}
}
参考:
推荐阅读
- snowflake-cloud-data-platform - 如何识别雪花模式中只有空值的所有列
- jquery - 确切的列宽
- javascript - 如何在 flatlist 中使用 Array.prototype.flat 反应原生?
- xaml - Xamarin 在 Android 上形成导航栏滚动
- python - 将 14 个数组的列表转换为单个数组(Keras 值错误)
- html - 如何在与文本大小相关的多个 div 之间设置不同的边框大小?
- javascript - 使用 Javascript 使用宏修改现有的 excel 文件
- reactjs - Videojs自定义TextTrackDisplay不起作用
- swift - 如何在 NixOS 上构建 Swift 项目?
- blackfire - Blackfire 分析错误 - 退出状态 60