如何过滤Python/PySpark应用中非自定义日志源的INFO级日志?
过滤Spark日志保留自定义INFO输出的简便方法
有两种高效方式可以实现需求,一种是事后过滤已有日志文件,另一种是从日志配置源头控制输出,按需选择即可:
一、事后过滤已生成的日志文件
如果已经产生大量冗余日志,直接用命令行工具快速筛选最简便:
- 按自定义日志的Logger名称匹配(比如你的自定义日志用
com.myapp作为包名):grep "INFO com.myapp" /var/log/yarn/userlogs/application_1683930949263_0001/container_1683930949263_0001_01_000009/stderr - 如果自定义日志内容有独特业务标识,直接匹配关键词:
grep "你的业务专属关键词" /var/log/yarn/userlogs/application_1683930949263_0001/container_1683930949263_0001_01_000009/stderr - 更灵活的筛选可用
awk,精准保留包含自定义Logger的INFO日志:awk '/INFO com.myapp/ {print $0}' /var/log/yarn/userlogs/application_1683930949263_0001/container_1683930949263_0001_01_000009/stderr
二、从日志配置源头控制(彻底解决日志淹没问题)
修改Spark日志配置,让非自定义组件直接不输出INFO级内容,从根源减少冗余:
复制并修改Log4j配置文件:
复制Spark默认日志模板($SPARK_HOME/conf/log4j.properties.template)到conf目录,重命名为log4j.properties,添加以下配置:# 将Spark、Hadoop等第三方组件日志级别设为WARN,屏蔽INFO输出 log4j.logger.org.apache.spark=WARN log4j.logger.org.apache.hadoop=WARN log4j.logger.org.spark_project=WARN log4j.logger.io.netty=WARN # 仅开启自定义包的INFO级别日志 log4j.logger.com.myapp=INFO把
com.myapp替换成你实际的自定义日志包名/Logger名称。提交应用时指定配置:
用spark-submit提交应用时,通过参数让Driver和Executor都加载该配置:spark-submit \ --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:/path/to/your/log4j.properties" \ --conf spark.executor.extraJavaOptions="-Dlog4j.configuration=file:/path/to/your/log4j.properties" \ --class com.myapp.YourMainClass \ your-app.jar若在YARN集群运行,需将配置文件上传至HDFS,路径改为
hdfs:///path/to/log4j.properties,确保所有Executor可访问。
内容的提问来源于stack exchange,提问作者Bar
相关产品推荐
相关产品推荐

