1. 程式人生 > >log4j的2.6.2版本properties配置檔案的使用舉例

log4j的2.6.2版本properties配置檔案的使用舉例

【寫作動機】

  log4j是由apache基金會開發的開源日誌元件,是用來記錄日誌檔案的一套API,截止發文當天(2016/09/28)的最新版為v2.6.2版。與傳統1.2版相比,新版log4j在properties配置檔案的具體使用上解釋不多,網上相關資料也很少。下面結合示例略作說明,希望起到理清思路、拋磚引玉的作用。

【官網文件參考】

  配置log4j的2.x版可以通過以下4中方式實現:

(1)通過xml格式、json格式、yaml格式或properties格式的配置檔案的方式;
(2)通過程式設計,建立ConfigurationFactory和實現Configuration介面的方式;
(3)通過程式設計,呼叫Configuration介面現成的各類API來向預設配置方式新增其他部件的方式;

(4)通過程式設計,呼叫內部Logger類方法的方式。

  這裡重點介紹properties格式的配置檔案在使用時的注意事項。

  log4j元件2.4以後的版本已經能夠支援.properties格式的配置檔案(之前的2.x版均不支援.properties配置),只是語法結構上與1.2版有所不同。新版properties格式配置檔案與其他格式(XML格式、JSON格式檔案等)一樣,配置的主要任務是完成對各類外掛及其屬性的定義。

  在2.6版之前——
   (1)properties配置檔案需要在首行列出定義的各類輸出源(appenders)、過濾器(filters)及記錄器(loggers)的名稱,並以逗號隔開,其後又需要按需要定義的元件與名稱聯絡起來,以鍵值對【某屬性=某值】的方式,成組地定義具體的屬性值。

   (2)值得注意的是,名稱並不需要逐一成組地指定屬性值,但必須保證下面列出的所有屬性及屬性值具有唯一性。如果沒有列出由逗號分隔的一組定義名稱,那麼這些名稱中就不能出現半形英文句點符號'.'。
   (3)此外,每一個獨立的元件必須包含一個特定的type屬性,以指明該元件對應的外掛型別(Plugin type)。

  從2.6版開始,這樣的定義名稱列表不再強制列出,因為名稱通常可以在首次使用時推斷出來。但如果確實需要定義更復雜的名稱,建議還是使用名稱列表。列表一旦列出便會生效。

  與基礎部分的配置不同,在建立子部件時,不能在某個元素上指定一系列名稱,而必須像下面舉例說明的RollingFileAppender那樣,在定義其多個策略(policies)的值時,必須先定義一個policies屬性對應的包裝元素(wrapper element):a

ppender.rolling.policies.type = Policies,然後再在它下面定義兩個子部件(TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy)各具體屬性的值。

  此外,properties配置檔案還支援如下屬性:advertiser、monitorInterval、name、packages、shutdownHook、status和verbose。

官方示例:RollingFileAppender的properties示例配置檔案如下:

status = error
name = PropertiesConfig
 
property.filename = target/rolling/rollingtest.log
 
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
 
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
 
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
 
appender.list.type = List
appender.list.name = List
appender.list.filter.threshold.type = ThresholdFilter
appender.list.filter.threshold.level = error
 
logger.rolling.name = com.example.my.app
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
 
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT

  由於缺乏更詳細的說明,也不能與RollingFileAppender的xml格式配置檔案作對比,上述properties格式內容理解起來難度較大。為便於比較,先列出1.2版常規的properties配置檔案,檔名為log4j.properties,要求根日誌級別為debug,配置兩個輸出目的地,一個到控制檯,級別為debug,一個到日誌檔案,級別為error,檔案完整路徑為e:\propertiesTest.log:

  1.2版log4j.properties檔案程式碼如下:

log4j.rootLogger=debug,a,b

log4j.appender.a=org.apache.log4j.ConsoleAppender
log4j.appender.a.Threshold=debug
log4j.appender.a.target=System.out
log4j.appender.a.layout=org.apache.log4j.PatternLayout
log4j.appender.a.layout.ConversionPattern=%m%n

log4j.appender.b=org.apache.log4j.FileAppender
log4j.appender.b.Threshold=error
log4j.appender.b.ImmediateFlush=true
log4j.appender.b.File=e:\\propertiesTest.log
log4j.appender.b.Append=true
log4j.appender.b.layout=org.apache.log4j.PatternLayout
log4j.appender.b.layout.ConversionPattern=%d -%m%n
  最新的log4j2.properties檔案程式碼如下:
status = warn
name = MyApp

appender.console.type = Console
appender.console.name = consoleLogDemo
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = debug
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
appender.console.target = System_out

appender.rolling.type = File
appender.rolling.name = fileLogDemo
appender.rolling.filter.threshold.type = ThresholdFilter
appender.rolling.filter.threshold.level = error
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d-%m%n
appender.rolling.append = true
appender.rolling.fileName = e:\\propertiesTest.log

rootLogger.level = debug
rootLogger.appenderRef.consolelogdemo.ref = consoleLogDemo
rootLogger.appenderRef.filelogdemo.ref = fileLogDemo

  與之對比的log4j2.xml檔案如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xml>
<Configuration status="warn" name="MyApp">
	<appenders>
		<Console name="consoleLogDemo" target="SYSTEM_OUT">
			<ThresholdFilter level="debug"/>
			<PatternLayout pattern="%m%n" />
		</Console>
		
		<File name="fileLogDemo" fileName="e:\\propertiesTest.log" append="true">
			<ThresholdFilter level="error" />
			<PatternLayout pattern="%d-%m%n" />
		</File>
	</appenders>
	     
	<loggers>
		<root level="debug">
			<appender-ref ref="consoleLogDemo"></appender-ref>
			<appender-ref ref="fileLogDemo"></appender-ref>
		</root>
	</loggers>
</Configuration>

對比新舊版本的properties檔案,可以有如下結論:

(1)舊版第一行定義根日誌級別與輸出目標的名稱語句被轉述到下方,宣告語句也更突顯結構性,用了上文中提到的包裝元素:

rootLogger.level = debug
rootLogger.appenderRef.consolelogdemo.ref = consoleLogDemo
rootLogger.appenderRef.filelogdemo.ref = fileLogDemo
其中第一句是指定根日誌的級別,為debug;第2、3句是在上一句包裝元素的統領下,指定哪些appender輸出源是預設執行根日誌的輸出級別。要用到的屬性是appender的name值
。注意左邊的name是全部小寫右邊才和定義的name完全一樣。如果漏寫第3句,則控制檯上將不顯示File型別的日誌記錄。

(2)新版本直接用appender.console.type和appender.console.name指定輸出源的型別為Console,指定的名稱為consoleLogDemo(不固定)。之所以省去原版首行的定義名稱列表,可能是從字面上也能推斷出要使用的是Console型別的appender吧。

(3)原來對console輸出級別作控制的log4j.appender.a.threshold=debug變成了先宣告type,再指定level的形式,結構性比原來更明顯了,有點“先聲明後使用”的感覺:
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = debug

(4)layout佈局屬性也是這樣,先宣告type型別(對應原來的log4j.appender.a.layout=org.apache.log4j.PatternLayout),再指定日誌記錄樣式pattern的值(對應原來的log4j.appender.a.layout.ConversionPattern=%m%n),新版本看起來更工整:
appender.console.layout.type = PatternLayout 
appender.console.layout.pattern = %m%n

(5)另外一個細節是,原版console屬性target的值要麼是System.err,要麼是System.out,前者日誌資訊顯示為紅色,後者為黑色,且只有這兩種屬性值。在新版中,屬性值的功能和個數不變,但寫法上要把英文句點符號"."改為下劃線"_"。

【其他準備工作】

使用log4j,原版需要匯入log4j-1.2.17.jar包,到某專案的WebContent/WEB-INF/lib目錄下。新版本v2.6.2版同之前的2.x各類版本一樣,匯入目錄不變,但需要匯入兩個新版jar包:

log4j-api-2.6.2.jar
log4j-core-2.6.2.jar

配置檔案方面,不論是log4j2.xml還是log4j2.properties,都需要複製到src根目錄下(如下圖所示


【具體使用】

只需要定義一個Logger型別的例項,用LogManager.getLogger(String name);語句具體建立。

示例程式碼如下:

package javastudy;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class HelloLog4j2 {
	public static Logger log4j2Demo = LogManager.getLogger(HelloLog4j2.class.getName());
	
	public static void main(String[] arg0) {
		log4j2Demo.trace("Demo1:我是trace資訊,通過.trace(Sting s1)生成。");
		log4j2Demo.debug("Demo2:我是debug資訊,通過.debug(String s2)生成。");
		log4j2Demo.info("Demo3:我是info資訊,通過.info(String s3)生成。");
		log4j2Demo.warn("Demo4:我是warn資訊,通過.warn(String s4)生成。");
		log4j2Demo.error("Demo5:我是error資訊,通過.error(String s5)生成。");
		log4j2Demo.fatal("Demo6:我是fatal資訊,通過.fatal(String s6)生成。");
		System.out.println();
		/*Valid Levels include: 
		 * (ALL <) TRACE < DEBUG < INFO < WARN < ERROR < FATAL (< OFF)*/
		log4j2Demo.log(Level.DEBUG, "Demo7:我是debug資訊,通過.log(Level.DEBUG,String s7)生成。");
		log4j2Demo.log(Level.ERROR, "Demo8:我是error資訊,通過.log(Level.ERROR,String s8)生成。");	
	}
}

執行結果:


日誌檔案生成情況:


日誌檔案內容:


  從結果中可知,由於根日誌規定顯示的最低級別為debug,因此trace級別的Demo1無法顯示。日誌級別按重要性遞增的方式可分為8個級別,常用的是中間6個級別:
(ALL <) TRACE < DEBUG < INFO < WARN < ERROR < FATAL (< OFF)

  因此,只需要在上文的log4j2.xml檔案中(注意檔名末尾有個2,與1.2版不同),把<root level="debug">改為<root level="trace">,即可在控制檯看到示例列出的所有級別的日誌資訊,但日誌檔案propertiesTest.log由於規定只允許error及以上級別的記錄,因此檔案內容保持不變。

參考資料:

http://logging.apache.org/log4j/2.x/manual/configuration.html
http://blog.csdn.net/lrenjun/article/details/8178875
http://www.cnblogs.com/hanfight/p/5721855.html
http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html
http://blog.csdn.net/lu8000/article/details/25754415
http://zengxiantao.iteye.com/blog/1881700

相關推薦

log4j的2.6.2版本properties配置檔案的使用舉例

【寫作動機】   log4j是由apache基金會開發的開源日誌元件,是用來記錄日誌檔案的一套API,截止發文當天(2016/09/28)的最新版為v2.6.2版。與傳統1.2版相比,新版log4j在

(飛歌筆記)springboot 2.03版本+ redis3.2版本 + yml配置檔案

剛剛才搭建好了springboot 2.03版本+ redis3.2版本 + yml配置檔案。發現網上相關與redis有幾個坑。 1: spring-boot-starter-data-redis與spring-boot-starter-redis兩個包的區別 看到很

log4j 2.0以後版本配置檔案命名規則

log4j是apache的一個開源專案,目前的版本已經更新到2.6.2,首先需要注意的是,log4j 2.0以後的版本與以往的1.x有一個明顯的不同,其配置檔案只能採用.xml, .json或者 .jsn。在預設情況下,系統選擇configuration檔案的優

redis3.2 最新版本啟動配置檔案redis.conf詳細說明

Redis啟動的時候,可以指定配置檔案,如下:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf &                                          

最新的dubbo 2.6.2版本中@Service註解的parameters配置BUG和解決方案

在描述這個BUG之前,我想先說一個需求場景,假設我們有一個DemoService介面: public interface DemoService { String sayHello(String name); String sayHello2(String

Django:Python3.6.2+Django2.0配置MySQL

cli database IT 添加 djang 合並 self. bsp 檢查 持續學習Django中。。。 Django默認使用的數據庫是python自帶的SQLlite3,但SQLlite並不適用於大型的項目,因此我將數據庫換成了MySQL,下面介紹下Django

elasticsearch 6.2 版本升級至6.4 版本服務啟動報錯

client 所有 share 步驟 secret jar 自動 pex nta 升級後發現es服務無法啟動,發現報錯如下: 升級原因:kibana 升級至6.4 無法正常啟動連接 6.2 版本es集群數據; x-pack 插件錯誤: [2018-09-19T17:12:5

nginx、thinkphp3.2、linux配置檔案配置

nginx.conf配置檔案:     server {         listen 9001;         server_name 127

properties配置檔案修改後讀取不到的解決方法【終極方案】

相信很多人也都遇到過這個問題了,最近又一次遇到了,不是讀不到內容就是報 IllegalArgumentException: Malformed \uxxxx encoding.這次小結一下之前的解決方法。 1.將工程clean一下,然後繼續跑,如果解決就OK,不行看第二條。 2.終極方案:更換

Android讀寫properties配置檔案

寫這篇文章之前可以成功執行,文章後就各種找不到檔案.所以並沒有採用此種方式,後期完善.詳見下篇解決方案. 配置檔案讀取很容易,修改需要注意許可權,比如assets目錄下就不允許修改. 配置檔案的建立: New --- File 命名後選擇properties方式開啟 配置檔案設定

Properties配置檔案常見錯誤寫法以及轉義字元說明

對轉義字元的使用,常見錯誤示例: jdbc.url=jdbc\:mysql\://192.168.0.1\:3306/test?useUnicode\=true&characterEncoding\=UTF-8 在Properties檔案中,分隔符有兩種存在方式:“=”(等於號

根據properties配置檔案獲取裡面的鍵值對,jfinal原始碼分析

在jfinal框架中,有一個Prop的類,該類提供對properties配置檔案裡獲取鍵值對的功能。 其底層還是用的是java.util.Properties的相關方法,只不過是人家進行了封裝而已。牛人都喜歡封裝原有的東西。 其建構函式Prop(String fileName,Str

IDEA建立的Gradle專案無法讀取jdbc.properties配置檔案

一、首先建立jdbc.properties檔案,但是用gradle構建的專案目錄結構是如下樣式的 建立jdbc.properties方法:右鍵---new---Resource Bundle---輸入檔名即可建立properties配置檔案 其中jdbc.properties檔案

資料庫之redis篇(2)—— redis配置檔案,常用命令,效能測試工具

redis配置 如果你是找網上的其他教程來完成以上操作的話,相信你見過有的啟動命令是這樣的:   啟動命令帶了這個引數:redis.windows.conf,由於我測試環境是windows平臺,所以是這個,有的是redis.conf。顧名思義,redis.conf就是配置檔案,然後啟動時加

spring中使用@Value註解獲取properties配置檔案中的變數值

在我們專案中往往會使用到properties配置檔案來定義一些跟系統環境有關的配置,因此今天我們學習使用spring中的@Value註解來快速方便地將我們配置檔案中的變數值賦值給java類的屬性值。 1.首先我們先在專案中建一個properties配置檔案,然後定義好我們需要的變數名和對應的

Spring—@PropertySource讀取properties配置檔案屬性

1、示例程式碼Controller層 @Controller @RequestMapping("/test") @PropertySource("classpath:application.properties") public class TestController {   &nb

Java 讀取 .properties 配置檔案

    java 開發中,經常要讀取 properties 配置檔案,下面介紹幾種讀取方式:     1、基於 InputStream 讀取配置檔案     該方式的優點在於可以讀取任意路徑下的配置檔案      Properties properties = new Proper

Properties 配置檔案

介紹 Properties(配置檔案類):主要用於生成配置檔案與讀取配置檔案的資訊。屬於集合體系的類,繼承了Hashtable類,實現了Map介面 因為 Properties 繼承於 Hashtable,所以可對 Properties 物件應用 put 和 putAll 方法。但

讀取properties配置檔案中屬性的值的工具類

自制讀取properties配置檔案的工具類 專案中常用的一些配置的維護,例如redis的ip,資料庫ip這些一點是用檔案維護起來,方便專案開發時進行除錯,為了方便以後使用,就直接封裝了一個工具類以便使用,程式碼如下: /** * 讀取properties配置檔案中屬性的值的工

問題討論:使用java.util.logging,每個專案使用自己的logging.properties配置檔案

問題討論:使用java.util.logging,每個專案使用自己的logging.properties配置檔案 主題:logging.properties配置檔案 詳細描述:使用jdk的java.util.logging,專案使用自己的配置檔案,而不是預設配置檔案(jre/lib/lo