1、spark job日誌介紹
spark中提供了log4j的方式記錄日誌。能夠在$SPARK_HOME/conf/下,將 log4j.properties.template 文件copy爲 log4j.properties 來啓用log4j配置。但這個配置爲全局配置,不能單獨配置某個job的運行日誌。
在Spark的conf目錄下,把log4j.properties.template修改成log4j.properties,原來的內容以下:(log4j的用法和配置,請參考另外一篇文檔)
# Set everything to be logged to the console
log4j.rootCategory=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{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
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
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
2、spark job獨立配置的log4j的方法
如今咱們介紹spark (streaming) job獨立配置的log4j的方法,經過查看官方文檔,要爲應用主程序(即driver端)或執行程序使(即executor端)自定義log4j配置,須要兩步就完成了,下面具體說明。
第一步:上傳自定義 log4j-driver.properties和log4j-executor.properties
第二步:添加-Dlog4j的配置。使用 --conf參數。
用於驅動程序:spark.driver.extraJavaOptions = -Dlog4j.configuration = <配置文件的位置>
用於執行者:spark.executor.extraJavaOptions= -Dlog4j.configuration = <配置文件的位置>
注意:driver端還可使用spark-submit的--driver-java-options參數去配置。
方案一:使用 spark-submit的 --files 參數將自定義的配置文件上傳到應用程序的文件列表中。java
spark-submit
--class com.hm.spark.Application
--master yarn --deploy-mode cluster
--driver-cores 1 --driver-memory 1G
--num-executors 2 --executor-cores 1 --executor-memory 1G
--driver-java-options "-Dlog4j.configuration=log4j-driver.properties"
--conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j-executor.properties"
--files /home/hadoop/spark-workspace/log4j-driver.properties,/home/hadoop/spark-workspace/log4j-executor.properties
/home/hadoop/spark-workspace/my-spark-etl-assembly-1.0-SNAPSHOT.jarmysql
注意,這裏我沒有使用spark.driver.extraJavaOptions參數去配置,而是使用spark-submit的--driver-java-options參數進行設置的。
方案二:不使用 spark-submit的 --files 參數上傳文件,直接使用文件。
spark-submit
--class com.hm.spark.Application
--master yarn --deploy-mode cluster
--driver-cores 1 --driver-memory 1G
--num-executors 2 --executor-cores 1 --executor-memory 1G
--driver-java-options "-Dlog4j.configuration=file:/home/hadoop/spark-workspace/log4j-driver.properties "
--conf spark.executor.extraJavaOptions="-Dlog4j.configuration=file:/home/hadoop/spark-workspace/log4j-executor.properties"
/home/hadoop/spark-workspace/my-spark-etl-assembly-1.0-SNAPSHOT.jar
注意:若是使用文件, file: 則應明確提供配置文件的,而且文件須要在全部節點上本地存在。
在shell腳本中寫的格式spring
- #!/bin/bash
-
- base_path=/data/service/spark-workspace
- version=1.0-SNAPSHOT
- jar_name=spark-etl_2.11-${version}-assembly.jar
- class_name=com.spark.etl.Application
- # client or cluster
- deploy_mode=cluster
- cmd="spark-submit --class ${class_name} --master yarn --deploy-mode ${deploy_mode} --driver-cores 1 --driver-memory 2G --num-executors 4 --executor-cores 2 --executor-memory 4G --driver-java-options \"-Dlog4j.configuration=log4j-driver.properties\" --conf spark.executor.extraJavaOptions=\"-Dlog4j.configuration=log4j-executor.properties\" --files ${base_path}/log4j-executor.properties,${base_path}/log4j-driver.properties ${base_path}/${jar_name}"
- echo "${cmd}"
須要注意的是--conf 後的配置項不能用加雙引號,可是參數值必須用雙引號括起來,「\」是shell腳本的轉義符。本人遇到的問題,以前在--conf後的配置項添加了引號,以下sql
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" shell
這樣在不寫入shell腳本中,直接在命令行中輸入,是沒有問題的,executor中的日誌能夠收集,若是在shell腳本中這樣寫,那executor是收集不到日誌,由於該參數不起效果,經過我屢次測試,千萬注意,在寫入shell腳本中,--conf 後配置項千萬不能加雙引號。數據庫
3、spark job的日誌輸出到指定文件
在測試spark計算時,將做業提交到yarn(模式–master yarn-cluster)上,想查看print到控制檯這是絕對不可能的,由於做業是提交到yarn的集羣上,因此去yarn集羣上看日誌是很麻煩的,但有特別想看下print的信息,方便調試或者別的目的
在Spark的conf目錄下,把log4j.properties.template修改成log4j.properties。
# Set everything to be logged to the console
log4j.rootCategory=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{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
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
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
把log4j.rootCategory=INFO, console改成log4j.rootCategory=WARN, console便可抑制Spark把INFO級別的日誌打到控制檯上。若是要顯示全面的信息,則把INFO改成DEBUG。
若是但願一方面把代碼中的println打印到控制檯,另外一方面又保留spark 自己輸出的日誌,能夠將它輸出到日誌文件中
配置內容以下:
# Set everything to be logged to the console
log4j.rootCategory=INFO, console, FILE
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{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
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
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.file=/home/hadoop/spark.log
log4j.appender.logFile.Encoding = UTF-8
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
# spark 只對com.ha.spark下的程序進行日誌優先級DEBUG輸出,其它包遵循全局日誌級別INFO
log4j.logger.com.ha.spark=DEBUG
上面的操做,spark的日誌一方面打印到控制檯,一方面寫入到/home/hadoop/spark.log中了,這是日誌的繼承特性,這樣有個弊端假設如今咱們把產品已經部署完成,設置好FileAppender和INFO,日誌就慢慢的在文件中記錄着。忽然有一天,咱們想要查看一下日誌文件了,可能會發現問題:日誌文件可能已經很是龐大了,打開很是緩慢,並且文件越大,作日誌的速度會愈來愈慢。因此咱們要使用RollingFileAppender或者DailyRollingFileAppender
首先,RollingFileAppender也可以將日誌記錄到文件中,而且能夠當一個文件到達了指定大小後,把這個日誌文件備份並重開一個日誌文件。RollingFileAppender是繼承自FileAppender,因此FileAppender那些配置項仍然可以使用。使用RollingFileAppender雖然能夠將文件大小控制在必定的範圍內,可是仍是會形成一些問題:1,文件命名沒有規律,可能會形成某一段時間的日誌分散在兩個日誌文件中,2,從文件名中很難定位具體的日誌信息。在真實的產品中,咱們要監控日誌,每每須要定位到某個具體的時間段裏面的日誌信息,使用RollingFileAppender就很難作到。Log4J也想到了這點,提供了DailyRollingFileAppender。
4、spark job的日誌和Yarn日誌進行聚合
若是您須要spark的日誌文件放入YARN中,以便YARN能夠正確顯示並聚合它們,則 在log4j.properties日誌配置文件中設置 spark.yarn.app.container.log.dir
例如, log4j.appender.File.file=${spark.yarn.app.container.log.dir}/spark-driver.log
對於流式應用程序則還應該RollingFileAppender和 DailyRollingFileAppender設定文件大小輸出到文件, 將避免YARN的日誌目錄由大型日誌文件引發的磁盤溢出,而且可使用YARN的日誌程序訪問日誌。
配置以下:
# Set everything to be logged to the console
log4j.rootCategory=INFO, console, FILE
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{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
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
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppende
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.File.file=${spark.yarn.app.container.log.dir}/spark-driver.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
# spark 只對com.ha.spark下的程序進行日誌優先級DEBUG輸出,其它包遵循全局日誌級別INFO
log4j.logger.com.ha.spark=DEBUGapache
DailyRollingFileAppender是日誌記錄軟件包Log4J中的一個Appender,它可以按必定的頻度滾動日誌記錄文件。bash
日誌文件爲: spark-driver.log-2010-01-01 , spark-driver.log-2010-01-02多線程
在DailyRollingFileAppender中能夠指定monthly(每個月)、weekly(每週)、daily(天天)、half-daily(每半天)、hourly(每小時)和minutely(每分鐘)六個頻度,這是經過爲 DatePattern選項賦予不一樣的值來完成的。DatePattern選項的有效值爲:app
* ‘.’yyyy-MM,對應monthly(每個月)
* ‘.’yyyy-ww,對應weekly(每週)
* ‘.’yyyy-MM-dd,對應daily(天天)
* ‘.’yyyy-MM-dd-a,對應half-daily(每半天)
* ‘.’yyyy-MM-dd-HH,對應hourly(每小時)
* ‘.’yyyy-MM-dd-HH-mm,對應minutely(每分鐘)
DatePattern中不用處理的文字要放到單引號(‘)中,如上面的(.)。
DatePattern格式化以後的文本做爲文件名字的後綴。DailyRollingFileAppender不支持格式化以後的文本做爲文件名字的前綴。
DailyRollingFileAppender在每個日誌事件(LoggingEvent)附加(append)以前檢查是否須要附加。也就是說若是在一個滾動區間中沒有任何日誌記錄,那麼這個區間的日誌記錄文件就不會造成。
5、spark log4j.properties配置詳解與實例(摘錄於銘霏的記事本)
################################################################################
#①配置根Logger,其語法爲:
#
#log4j.rootLogger = [level],appenderName,appenderName2,...
#level是日誌記錄的優先級,分爲OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
##Log4j建議只使用四個級別,優先級從低到高分別是DEBUG,INFO,WARN,ERROR
#經過在這裏定義的級別,您能夠控制到應用程序中相應級別的日誌信息的開關
#好比在這裏定義了INFO級別,則應用程序中全部DEBUG級別的日誌信息將不被打印出來
#appenderName就是指定日誌信息輸出到哪一個地方。可同時指定多個輸出目的
################################################################################
################################################################################
#②配置日誌信息輸出目的地Appender,其語法爲:
#
#log4j.appender.appenderName = fully.qualified.name.of.appender.class
#log4j.appender.appenderName.optionN = valueN
#
#Log4j提供的appender有如下幾種:
#1)org.apache.log4j.ConsoleAppender(輸出到控制檯)
#2)org.apache.log4j.FileAppender(輸出到文件)
#3)org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件)
#4)org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
#5)org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
#
#1)ConsoleAppender選項屬性
# -Threshold = DEBUG:指定日誌消息的輸出最低層次
# -ImmediateFlush = TRUE:默認值是true,全部的消息都會被當即輸出
# -Target = System.err:默認值System.out,輸出到控制檯(err爲紅色,out爲黑色)
#
#2)FileAppender選項屬性
# -Threshold = INFO:指定日誌消息的輸出最低層次
# -ImmediateFlush = TRUE:默認值是true,全部的消息都會被當即輸出
# -File = C:\log4j.log:指定消息輸出到C:\log4j.log文件
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容
# -Encoding = UTF-8:能夠指定文件編碼格式
#
#3)DailyRollingFileAppender選項屬性
# -Threshold = WARN:指定日誌消息的輸出最低層次
# -ImmediateFlush = TRUE:默認值是true,全部的消息都會被當即輸出
# -File = C:\log4j.log:指定消息輸出到C:\log4j.log文件
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容
# -DatePattern='.'yyyy-ww:每週滾動一次文件,即每週產生一個新的文件。還能夠按用如下參數:
# '.'yyyy-MM:每個月
# '.'yyyy-ww:每週
# '.'yyyy-MM-dd:天天
# '.'yyyy-MM-dd-a:天天兩次
# '.'yyyy-MM-dd-HH:每小時
# '.'yyyy-MM-dd-HH-mm:每分鐘
# -Encoding = UTF-8:能夠指定文件編碼格式
#
#4)RollingFileAppender選項屬性
# -Threshold = ERROR:指定日誌消息的輸出最低層次
# -ImmediateFlush = TRUE:默認值是true,全部的消息都會被當即輸出
# -File = C:/log4j.log:指定消息輸出到C:/log4j.log文件
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容
# -MaxFileSize = 100KB:後綴能夠是KB,MB,GB.在日誌文件到達該大小時,將會自動滾動.如:log4j.log.1
# -MaxBackupIndex = 2:指定能夠產生的滾動文件的最大數
# -Encoding = UTF-8:能夠指定文件編碼格式
################################################################################
################################################################################
#③配置日誌信息的格式(佈局),其語法爲:
#
#log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
#log4j.appender.appenderName.layout.optionN = valueN
#
#Log4j提供的layout有如下幾種:
#5)org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
#6)org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式)
#7)org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串)
#8)org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
#9)org.apache.log4j.xml.XMLLayout(以XML形式佈局)
#
#5)HTMLLayout選項屬性
# -LocationInfo = TRUE:默認值false,輸出java文件名稱和行號
# -Title=Struts Log Message:默認值 Log4J Log Messages
#
#6)PatternLayout選項屬性
# -ConversionPattern = %m%n:格式化指定的消息(參數意思下面有)
#
#9)XMLLayout選項屬性
# -LocationInfo = TRUE:默認值false,輸出java文件名稱和行號
#
#Log4J採用相似C語言中的printf函數的打印格式格式化日誌信息,打印參數以下:
# %m 輸出代碼中指定的消息
# %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
# %r 輸出自應用啓動到輸出該log信息耗費的毫秒數
# %c 輸出所屬的類目,一般就是所在類的全名
# %t 輸出產生該日誌事件的線程名
# %n 輸出一個回車換行符,Windows平臺爲「\r\n」,Unix平臺爲「\n」
# %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式
# 如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},輸出相似:2012年01月05日 22:10:28,921
# %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數
# 如:Testlog.main(TestLog.java:10)
# %F 輸出日誌消息產生時所在的文件名稱
# %L 輸出代碼中的行號
# %x 輸出和當前線程相關聯的NDC(嵌套診斷環境),像java servlets多客戶多線程的應用中
# %% 輸出一個"%"字符
#
# 能夠在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
# %5c: 輸出category名稱,最小寬度是5,category<5,默認的狀況下右對齊
# %-5c:輸出category名稱,最小寬度是5,category<5,"-"號指定左對齊,會有空格
# %.5c:輸出category名稱,最大寬度是5,category>5,就會將左邊多出的字符截掉,<5不會有空格
# %20.30c:category名稱<20補空格,而且右對齊,>30字符,就從左邊交遠銷出的字符截掉
################################################################################
################################################################################
#④指定特定包的輸出特定的級別
#log4j.logger.org.springframework=DEBUG
################################################################################
#OFF,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB,ALL
log4j.rootLogger =ALL,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB
#輸出到控制檯
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Threshold = DEBUG
log4j.appender.systemOut.ImmediateFlush = TRUE
log4j.appender.systemOut.Target = System.out
#輸出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = TRUE
log4j.appender.logFile.Append = TRUE
log4j.appender.logFile.File = ../Struts2/WebRoot/log/File/log4j_Struts.log
log4j.appender.logFile.Encoding = UTF-8
#按DatePattern輸出到文件
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logDailyFile.Threshold = DEBUG
log4j.appender.logDailyFile.ImmediateFlush = TRUE
log4j.appender.logDailyFile.Append = TRUE
log4j.appender.logDailyFile.File = ../Struts2/WebRoot/log/DailyFile/log4j_Struts
log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log'
log4j.appender.logDailyFile.Encoding = UTF-8
#設定文件大小輸出到文件
log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logRollingFile.Threshold = DEBUG
log4j.appender.logRollingFile.ImmediateFlush = TRUE
log4j.appender.logRollingFile.Append = TRUE
log4j.appender.logRollingFile.File = ../Struts2/WebRoot/log/RollingFile/log4j_Struts.log
log4j.appender.logRollingFile.MaxFileSize = 1MB
log4j.appender.logRollingFile.MaxBackupIndex = 10
log4j.appender.logRollingFile.Encoding = UTF-8
#用Email發送日誌
log4j.appender.logMail = org.apache.log4j.net.SMTPAppender
log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout
log4j.appender.logMail.layout.LocationInfo = TRUE
log4j.appender.logMail.layout.Title = Struts2 Mail LogFile
log4j.appender.logMail.Threshold = DEBUG
log4j.appender.logMail.SMTPDebug = FALSE
log4j.appender.logMail.SMTPHost = SMTP.163.com
log4j.appender.logMail.From = xly3000@163.com
log4j.appender.logMail.To = xly3000@gmail.com
#log4j.appender.logMail.Cc = xly3000@gmail.com
#log4j.appender.logMail.Bcc = xly3000@gmail.com
log4j.appender.logMail.SMTPUsername = xly3000
log4j.appender.logMail.SMTPPassword = 1234567
log4j.appender.logMail.Subject = Log4j Log Messages
#log4j.appender.logMail.BufferSize = 1024
#log4j.appender.logMail.SMTPAuth = TRUE
#將日誌登陸到MySQL數據庫
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
log4j.appender.logDB.URL = jdbc:mysql://127.0.0.1:3306/xly
log4j.appender.logDB.User = root
log4j.appender.logDB.Password = 123456
log4j.appender.logDB.Sql = INSERT INTOT_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('Struts2','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
長按識別關注咱們,天天都有精彩技術內容分享哦 ~~
![](http://static.javashuo.com/static/loading.gif)