1. 程式人生 > >scala專案中使用log4j2建立日誌系統

scala專案中使用log4j2建立日誌系統

一、    關於Log4J

2015年5月,Apache宣佈Log4J 1.x 停止更新。最新版為1.2.17。

如今,Log4J 2.x已更新至2.7。

二、    Log4J能做什麼?

1.    將資訊送到控制檯,檔案,GUI元件等。

2.    控制每條資訊的輸出格式。

3.    將資訊分類,定義資訊級別,細緻地控制日誌的輸出。

三、    Log4J2的安裝

1.    去官網下載log4j2,解壓

2.    最基本的Jar包:

log4j-api-2.7.jar

log4j-core-2.7.jar

3. 將jar檔案複製到Web專案的WEB-INF/lib目錄下。

四、    配置檔案介紹

1.    日誌級別

trace:追蹤,就是程式推進一下,可以寫個trace輸出

debug:除錯,一般作為最低級別,trace基本不用。

info:輸出重要的資訊,使用較多

warn:警告,有些資訊不是錯誤資訊,但也要給程式設計師一些提示。

error:錯誤資訊。用的也很多。

fatal:致命錯誤。級別較高,這種級別不用除錯了,重寫吧……

機制:如果一條日誌資訊的級別大於等於配置檔案的級別,就記錄。

2.    輸出源

CONSOLE(輸出到控制檯)、FILE(輸出到檔案)等。

3.    佈局方式

SimpleLayout:以簡單的形式顯示

HTMLLayout:以HTML表格顯示

PatternLayout:自定義形式顯示

在Log4J2中基本採用PatternLayout自定義日誌佈局。

自定義格式:

%t:執行緒名稱

%p:日誌級別

%c:日誌訊息所在類名

%m:訊息內容

%M:輸出執行方法

%d:發生時間,%d{yyyy-MM-dd HH:mm:ss,SSS},輸出類似:2011-10-18 22:10:28,921

%x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。

%L:程式碼中的行數

%n:換行

<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -%msg%xEx%n"/>

c{precision}

logger{precision}

class{precision}àOutputs the name of the logger thatpublished the logging event.

Conversion Pattern

Logger Name

Result

%c{1}

org.apache.commons.Foo

Foo

%c{2}

org.apache.commons.Foo

commons.Foo

%c{10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{-1}

org.apache.commons.Foo

apache.commons.Foo

%c{-2}

org.apache.commons.Foo

commons.Foo

%c{-10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{1.}

org.apache.commons.Foo

o.a.c.Foo

%c{1.1.~.~}

org.apache.commons.test.Foo

o.a.~.~.Foo

%c{.}

org.apache.commons.test.Foo

....Foo

p|level{level=label,level=label, ...} p|level{length=n} p|level{lowerCase=true|false}à you can define the length of the levellabel:

m{nolookups}{ansi}|msg{nolookups}{ansi}|message{nolookups}{ansi}àsupplied message

xEx|xException|xThrowableàsuppress printing of the exception

五、    配置使用

1.    配置檔案命名與儲存位置(Log4J沒有預設的配置檔案)

系統選擇configuration檔案的優先順序如下(放在src資料夾):

classpath下名為 log4j-test.json 或者log4j-test.jsn檔案

classpath下名為 log4j2-test.xml

classpath下名為 log4j.json 或者log4j.jsn檔案

classpath下名為 log4j2.xml

很多人認為src就是classpath,java專案中Classpath路徑到底指的是哪裡?

1)   src不是classpath,WEB-INF/classes,lib才是classpath,WEB-INF/是資源目錄, 客戶端不能直接訪問。

2)   WEB-INF/classes目錄存放src目錄java檔案編譯之後的class檔案,xml、properties等資源配置檔案,這是一個定位資源的入口。

3)   lib和classes同屬classpath,兩者的訪問優先順序為: lib>classes。

2.使用方法,案例

package com.log4j2;  
  
import org.apache.logging.log4j.Logger;  
import org.apache.logging.log4j.LogManager;  
  
public class test {  
  
    static Logger logger = LogManager.getLogger(test.class.getName());  
      
    public static boolean hello(){  
        logger.trace("entry");  //等同於logger.entry();但此方法在新版本好像已經廢棄  
          
        logger.error("Did it again!");  
          
        logger.info("這是info級資訊");  
  
        logger.debug("這是debug級資訊");  
          
        logger.warn("這是warn級資訊");  
          
        logger.fatal("嚴重錯誤");  
          
        logger.trace("exit");  
          
        return false;  
    }  
      
    public static void main(String[] args) {  
          
        logger.trace("開始主程式");  
          
        for(int i = 0; i < 10000; i++){  
            logger.info("當前i:"+i);  
            if(!test.hello()){  
                logger.error("hello");  
            }  
        }  
          
        logger.trace("退出程式");  
    }  
}  
log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?>    
<configuration status="error">  
<!--     先定義所有的appender -->  
    <appenders>  
<!--         這個輸出控制檯的配置 -->  
        <Console name="Console" target="SYSTEM_OUT">  
<!--             控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch) -->  
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>  
<!--             這個都知道是輸出日誌的格式 -->  
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>  
        </Console>  
          
<!--         檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 -->  
<!--         append為TRUE表示訊息增加到指定檔案中,false表示訊息覆蓋指定的檔案內容,預設值是true -->  
        <File name="log" fileName="log/test.log" append="false">  
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>  
        </File>  
          
<!--          新增過濾器ThresholdFilter,可以有選擇的輸出某個級別以上的類別  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕  -->  
        <File name="ERROR" fileName="logs/error.log">  
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>  
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>  
        </File>  
  
<!--         這個會打印出所有的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔 -->  
        <RollingFile name="RollingFile" fileName="logs/web.log"  
                     filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">  
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>  
            <SizeBasedTriggeringPolicy size="2MB"/>  
        </RollingFile>  
    </appenders>  
      
<!--     然後定義logger,只有定義了logger並引入的appender,appender才會生效 -->  
    <loggers>  
<!--         建立一個預設的root的logger -->  
        <root level="trace">  
            <appender-ref ref="RollingFile"/>  
            <appender-ref ref="Console"/>  
            <appender-ref ref="ERROR" />  
            <appender-ref ref="log"/>  
        </root>  
  
    </loggers>  
</configuration> 

上面的為java對應的配置和事例

下面好戲開始:

scala使用log4j2需要引入兩個原始jar包和一個與scala關聯的jar包分別為: log4j-core,log4j-api,log4j-api-scala_2.11三個包

pom.xml檔案配置如下:

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api-scala_${scala.binary.version}</artifactId>
	<version>11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.10.0</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.10.0</version>
</dependency>
1.引入之後在scala object 類和包中引用時看官網給的例子是extends base with logging ,後來才知道with是scala中多繼承使用的關鍵字也就是說使用時直接在類名或者object 名後加上extends logging就可以了。2.然後在下面的方法中使用logger.debug("資訊") 或者 error,warn等就可以了。

其中一部分轉自大神的:Log4J2入門·配置詳解

https://blog.csdn.net/womeng2009/article/details/53510913