slf4j提供的是一個抽象的接口,實現可以是log4j、logback等,但是,運行時候只能有一個接口實現類。
org.apache.hadoop:hadoop-common包自帶log4j,maven中配置了安裝hadoop-common也相當於自動安裝了log4j。
org.apache.spark:spark-core_2.11自帶log4j。
log4j文檔:http://logging.apache.org/log4j/2.x/manual/configuration.html#Properties
學習參考網址:https://baike.baidu.com/item/log4j/480673?fr=aladdin
https://blog.csdn.net/u013870094/article/details/79518028
一、log4j的基本使用方法
(1)在maven配置文件中添加log4j相關的依賴
<!-- 加入log4j支持 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> |
(2)在項目中添加log4j的配置文件
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)log4j.properties。
配置文件要放在src.main下新建的一個資源文件夾resources里面,並把resources文件夾Mark as Resources格式。
把resources文件夾Mark as Resources格式方法:
IDEA-->FIle-->Project Seetings-->Modules-->右側選中src.main.resource文件夾,再點擊右側中間Mark as中的Resources-->Apply-->OK |
src.main.resources文件夾里的log4j.properties
### 設置Logger |
(3)在程序中調用
例如App.scala
import org.apache.log4j.Logger object App { |
二、log4j配置文件詳細介紹
Log4j由三個重要的組件構成:日志信息的優先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優先級從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制台還是文件中;而輸出格式則控制了日志信息的顯 示內容。
下面介紹使用Java特性文件log4j.properties做為配置文件的方法:
1.配置Logger
Logger 負責處理日志記錄的大部分操作。
根Logger語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, … |
appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。
appenderName一定要是大寫,而且逗號之間不能有空格。
|
其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log
4
j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。
<
br
>
通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。
<
br
>
比如在這里定義了INFO級別,只有等於及高於這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。
<
br
>
ALL
:
打印所有的日志,OFF:關閉所有的日志輸出。
|
定義非根記錄器的語法:
log4j.logger.loggerName1 = [ level ], appendName1,…appendNameN …… log4j.logger.loggerNameM = [ level ], appendName1, …appendNameN |
可以定義任意個非根記錄器,非根記錄器對根記錄器有繼承和覆蓋的關系。
非根記錄器的level可繼承根記錄器,也可比根記錄器高級或低級,且不影響根記錄器的日志記錄。
2.配置日志信息輸出目的地Appender
Appender 負責控制日志記錄操作的輸出。
其語法為:
og4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN |
appenderName可任意起名。
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件), org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件), |
3.配置日志信息的格式(布局)Layout
Layout 負責格式化Appender的輸出。
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN |
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以靈活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串), org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息) |
Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:
%m 輸出代碼中指定的消息; %M 輸出打印該條日志的方法名; %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL; %r 輸出自應用啟動到輸出該log信息耗費的毫秒數; %c 輸出所屬的類目,通常就是所在類的全名; %t 輸出產生該日志事件的線程名; %n 輸出一個回車換行符,Windows平台為"rn”,Unix平台為"n”; %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如: %d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2002-10-18 22:10:28,921; %l 輸出日志事件的發生位置,及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10) |
三、Scala程序中調用
1.獲得日志記錄器
使用Log4j,第一步就是獲取日志記錄器,這個記錄器將負責控制日志信息。
獲取根記錄器語法為:
import org.apache.log4j.Logger private val logRoot:Logger = Logger.getRootLogger |
根據記錄器名字獲取記錄器語法為:
private val log:Logger = Logger.getLogger(StringName) |
非根記錄器調用相互不影響,但是調用非根記錄,根記錄的語句一樣會執行。
2.插入記錄信息(格式化日志信息)
使用不同優先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:
Logger.debug ( Object message ) ; Logger.info ( Object message ) ; Logger.warn ( Object message ) ; Logger.error ( Object message ) ; |
日志級別
每個Logger都被了一個日志級別(log level),用來控制日志信息的輸出。日志級別從高到低分為:
off 最高等級,用於關閉所有日志記錄。 fatal 指出每個嚴重的錯誤事件將會導致應用程序的退出。 error 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。 warm 表明會出現潛在的錯誤情形。 info 一般和在粗粒度級別上,強調應用程序的運行全程。 debug 一般用於細粒度級別上,對調試應用程序非常有幫助。 all 最低等級,用於打開所有日志記錄。 |
上面這些級別是定義在org.apache.log4j.Level類中。Log4j只建議使用4個級別,優先級從高到低分別是error,warn,info和debug。通過使用日志級別,可以控制應用程序中相應級別日志信息的輸出。例如,如果使用b了info級別,則應用程序中所有低於info級別的日志信息(如debug)將不會被打印出來。
舉個log4j.xml例子,log4j.xml和log4j.properties同時存在的時候,xml文件會替換到properties文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration> <!-- 日志輸出到控制台 --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- 日志輸出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> <!--過濾器設置輸出的級別--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- 設置日志輸出的最小級別 --> <param name="levelMin" value="INFO"/> <!-- 設置日志輸出的最大級別 --> <param name="levelMax" value="ERROR"/> </filter> </appender> <!-- 輸出日志到文件 --> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <!-- 輸出文件全路徑名--> <param name="File" value="/home/xl/CodeStore/log_log4j/logxml.log"/> <!--是否在已存在的文件追加寫:默認時true,若為false則每次啟動都會刪除並重新新建文件--> <param name="Append" value="false"/> <param name="Threshold" value="INFO"/> <!--是否啟用緩存,默認false--> <param name="BufferedIO" value="false"/> <!--緩存大小,依賴上一個參數(bufferedIO), 默認緩存大小8K --> <param name="BufferSize" value="512"/> <!-- 日志輸出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> </appender> <!-- 日志輸出到文件,可以配置多久產生一個新的日志信息文件 --> <appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender"> <!-- 文件文件全路徑名 --> <param name="File" value="/home/xl/CodeStore/log_log4j/logxml1.log"/> <param name="Append" value="true" /> <!-- 設置日志備份頻率,默認:為每天一個日志文件 --> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <!--每分鍾一個備份--> <!--<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />--> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> </appender> <!-- 1. 指定logger的設置,additivity是否遵循缺省的繼承機制 2. 當additivity="false"時,root中的配置就失靈了,不遵循缺省的繼承機制 3. 代碼中使用Logger.getLogger("logTest")獲得此輸出器,且不會使用根輸出器 --> <logger name="logTest" additivity="false"> <level value ="INFO"/> <appender-ref ref="dailyRollingAppender"/> </logger> <!-- 根logger的設置,若代碼中未找到指定的logger,則會根據繼承機制,使用根logger--> <root> <appender-ref ref="console"/> <appender-ref ref="fileAppender"/> <appender-ref ref="dailyRollingAppender"/> </root> </log4j:configuration> |