在Spark Standalone模式下,spark默认使用org/apache/spark/log4j-defaults.properties配置,所有的日志都记录在stderr里面,由于Spark Streaming应用程序是一直运行的,时间长了以后stderr文件会非常大,占用空间的同时难以让我们调试和定位问题,所以我们需要切分日志,spark原生提供了对Executor日志的切分,Driver日志需要我们单独配置log4j。
- Executor日志切分,在spark应用环境变量中配置
spark.executor.logs.rolling.strategy time //可以按日期(time)和日志大小(size)来切分日志
spark.executor.logs.rolling.time.interval daily //可以按天、小时、分钟切分
spark.executor.logs.rolling.maxRetainedFiles 7 //保留多少个日志文件,旧的日志自动删除
- 1
- 2
- 3
或者也可以自定义日志生成方式,只要配置参数spark.executor.extraJavaOptions,指定log4j配置。
- Driver日志切分
sparksubmit的时候自定义log4j, –driver-java-options “-Dlog4j.configuration=file:/$PATH/log4j-driver.properties -Dapp.logging.name=NAME” ,用NAME去区分不同spark应用
log4j.rootCategory=INFO, FILE
log4j.appender.FILE.Threshold=info
log4j.appender.FILE.file=/$PATH/${app.logging.name}-driver.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%p] %d %c %M - %m%n
二。
由于spark on yarn的日志会在stderr里面一直追加,而且streaming又是长应用,那么stderr会一直增长。解决办法就是把stderr按天切割,这样我们就可以删除之前的日志了。
1. 首先,把集群中的hadoop的log4j文件/etc/hadoop/conf/log4j.properties添加如下两行:
log4j.additivity.com.kingsoft = false com.kingsoft是项目的包名
log4j.additivity.org.apache.spark = false
然后把log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n的%c{2}改成%c{30}
最终的结果如下:
log4j.rootLogger=${root.logger}
root.logger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{30}: %m%n
log4j.additivity.com.kingsoft = false
log4j.additivity.org.apache.spark = false
2. 编写一个 log4j.properties 文件,内容如下:
log4j.rootCategory=INFO, click_all
# Settings to quiet third party logs that are too verbose
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.appender.click_all = org.apache.log4j.DailyRollingFileAppender
log4j.appender.click_all.File = /sparklogs/click_all.log
log4j.appender.click_all.DatePattern = '.'yyyy-MM-dd_HH
log4j.appender.click_all.Append = true
log4j.appender.click_all.Threshold = INFO
log4j.appender.click_all.layout = org.apache.log4j.PatternLayout
log4j.appender.click_all.layout.ConversionPattern = %d{yy/MM/dd HH:mm:ss} %p %c{30}: %m%n
log4j.additivity.com._58city = false
log4j.logger.com._58city = INFO, click
log4j.appender.click = org.apache.log4j.DailyRollingFileAppender
log4j.appender.click.File = /sparklogs/click.log
log4j.appender.click.DatePattern = '.'yyyy-MM-dd_HH
log4j.appender.click.Append = true
log4j.appender.click.Threshold = INFO
log4j.appender.click.layout = org.apache.log4j.PatternLayout
log4j.appender.click.layout.ConversionPattern = %d{yy/MM/dd HH:mm:ss} %p %c{30}: %m%n