Spark默認是集成log4j做爲日誌框架的,所以在咱們的Spark做業中也使用log4j來輸出日誌。
不過,若是隻是簡單地將自定義的log4j.properties文件扔進項目的resources文件夾,而後直接打包運行的話,會發現程序根本不會鳥它,打印出來的日誌與以前徹底相同,也不會輸出到文件。這時能夠在spark-submit的driver JVM參數中,打開log4j的調試開關:python
bin/spark-submit \ ...... --conf "spark.driver.extraJavaOptions=-XX:+UseG1GC -Dlog4j.debug=true" \ ......
而後程序運行時就會輸出當前生效的log4j配置文件路徑。咱們是基於CDH安裝的Spark,配置文件路徑是/etc/spark/conf/log4j.properties,也就是默認的配置。它的內容以下:shell
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{2}: %m%n shell.log.level=WARN log4j.logger.org.eclipse.jetty=WARN log4j.logger.org.spark-project.jetty=WARN log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO log4j.logger.org.apache.parquet=ERROR log4j.logger.parquet=ERROR log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR log4j.logger.org.apache.spark.repl.Main=${shell.log.level} log4j.logger.org.apache.spark.api.python.PythonGatewayServer=${shell.log.level}
可見裏面只有控制檯的輸出。若是咱們想全局更改全部Spark做業的日誌格式,直接在這個文件裏增長或修改Appender便可,如:apache
log4j.rootLogger=INFO,C,R # 控制檯輸出卡在WARN log4j.appender.C=org.apache.log4j.ConsoleAppender log4j.appender.C.Threshold=WARN log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p [%c] - %m%n # 新增滾動文件的日誌輸出 log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=/var/projects/calendar/logs/calendar.log log4j.appender.R.Threshold=INFO log4j.appender.R.Append=true log4j.appender.R.MaxFileSize=16MB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p [%c] - %m%n # 如下照搬原文件配置,主要是防止一些Spark引用的第三方組件日誌輸出過多 log4j.logger.org.eclipse.jetty=WARN log4j.logger.org.spark-project.jetty=WARN log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR ......
若是不採用全局更改日誌配置的方法,還能夠單獨配置。分別更改driver和executor的spark-submit JVM參數以下:api
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/path/to/log4j.properties" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/path/to/log4j.properties"
咱們的做業幾乎都運行在yarn-cluster或者yarn-client模式下,須要配置文件在每一個節點上都存在,所以可能還須要用--files參數將log4j.properties上傳。
最後再更改一下日誌文件的輸出位置,就能夠將做業日誌與YARN container日誌聚合在一塊兒(回憶一下,Spark on YARN模式中,container:executor:task是1:1:n對應的),方便在UI界面查看:bash
log4j.appender.R.File=${spark.yarn.app.container.log.dir}/spark.log