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