IDEA+scala程序中調用日志-log4j


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
log4j.rootLogger = debug,stdout,D,E
log4j.logger.log1 = ,F
log4j.logger.log2 = WARN,G

### 輸出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 輸出DEBUG 級別以上的日志到=/home/xl/CodeStore/log_log4j/log1.log ###
log4j.appender.F = org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File = /home/xl/CodeStore/log_log4j/log1.log
log4j.appender.F.Append = true
log4j.appender.F.Threshold = DEBUG
log4j.appender.F.layout = org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern = %-d{yyyy-MM-dd} [ %t:%r ] - [ %p ] %m%n

### 輸出WARN 級別以上的日志到=/home/xl/CodeStore/log_log4j/log2.log ###
log4j.appender.G = org.apache.log4j.DailyRollingFileAppender
log4j.appender.G.File = /home/xl/CodeStore/log_log4j/log2.log
log4j.appender.G.Append = true
log4j.appender.G.Threshold = WARN
log4j.appender.G.layout = org.apache.log4j.PatternLayout
log4j.appender.G.layout.ConversionPattern = %-d{yyyy-MM-dd} [ %t:%r ] - [ %p ] %m%n

### 輸出DEBUG 級別以上的日志到=/home/xl/CodeStore/log_log4j/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /home/xl/CodeStore/log_log4j/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### 輸出ERROR 級別以上的日志到=/home/xl/CodeStore/log_log4j/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/xl/CodeStore/log_log4j/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd} [ %t:%r ] %m%n

 

(3)在程序中調用

例如App.scala

import org.apache.log4j.Logger
object App {
private val logRoot:Logger = Logger.getRootLogger
private val log1:Logger = Logger.getLogger("log1")

def main(args : Array[String]) {
println( "Hello World!" )
// 記錄debug級別的信息
logRoot.debug("This is debug message.");
log1.debug("This is debug message.");
// 記錄info級別的信息
logRoot.info("This is info message.");
log1.info("This is info message.");
// 記錄error級別的信息
logRoot.error("This is error message.");
log1.error("This is error message.");
}
}

 

  

二、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(文件大小到達指定尺寸的時候產生一個新的文件),
可通過log4j.appender.R.MaxFileSize=100KB設置文件大小,
還可通過log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。 org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

 

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>

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM