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來向預設配置方式新增其他部件的方式;
這裡重點介紹properties格式的配置檔案在使用時的注意事項。
log4j元件2.4以後的版本已經能夠支援.properties格式的配置檔案(之前的2.x版均不支援.properties配置),只是語法結構上與1.2版有所不同。新版properties格式配置檔案與其他格式(XML格式、JSON格式檔案等)一樣,配置的主要任務是完成對各類外掛及其屬性的定義。
在2.6版之前——
(1)properties配置檔案需要在首行列出定義的各類輸出源(appenders)、過濾器(filters)及記錄器(loggers)的名稱,並以逗號隔開,其後又需要按需要定義的元件與名稱聯絡起來,以鍵值對【某屬性=某值】的方式,成組地定義具體的屬性值。
(3)此外,每一個獨立的元件必須包含一個特定的type屬性,以指明該元件對應的外掛型別(Plugin type)。
從2.6版開始,這樣的定義名稱列表不再強制列出,因為名稱通常可以在首次使用時推斷出來。但如果確實需要定義更復雜的名稱,建議還是使用名稱列表。列表一旦列出便會生效。
與基礎部分的配置不同,在建立子部件時,不能在某個元素上指定一系列名稱,而必須像下面舉例說明的RollingFileAppender那樣,在定義其多個策略(policies)的值時,必須先定義一個policies屬性對應的包裝元素(wrapper element):a
此外,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