目前分類:Log (8)

瀏覽方式: 標題列表 簡短摘要

  通常在log4j.xml會有如下的配置:

<root>

Jemmy 發表在 痞客邦 留言(0) 人氣()

  一段時間沒記Blog了,顯示筆者狀態由【研發】轉為【專案】。研發時用Survey最新技術看是否有助提升開發品質,專案時則需選擇最穩定技術,取得進度與風險之間的最佳平衡。三年前接手他人銀行專案前,我為該專案研發最適用的Framework,即使專案成員在程式能力不強,依然需當作客戶看待。之後我接手成為該專案Leader,卻屢屢與其中一位成員衝突,該成員說詞是為何以前可以現在不行,而我回答就是因為可以,前Leader才會被換掉。最後身為Leader,我把他換下來了。角色的轉換,不單關注焦點思維不同,連決策及身負的責任也殊異。

  以上與本主題無關,目前要著手的專案,對Log有個By Size與By Time的需求。目前最新的Log4J核心Jar並無此功能,週邊我倒是找到兩個,一個是今年5/18釋出的TimeAndSizeRollingAppender,自http://simonsiteblog.blogspot.com/取得,並無Maven Repository。所以得比照Oracle的JDBC Jar方式放置到Local Repository。以下是用log4j.xml配置:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  踹JPA過程,老是遇到如下的Exception:

Caused by: java.lang.AbstractMethodError: org.slf4j.impl.Log4jLoggerAdapter.trace(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V

  搞了半天,slf4j-api和slf4j-log12沒有同步到同一版本,即1.5.8。實在踹老半天>"<

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Log4J的1.3版還在阿法貝塔階段。1.2版最新到1.2.15,但用於Eclipse上的Maven2卻有個Issue。在執行Maven Clean後再執行Maven Package會Build Failure,有以下的錯誤訊息:

[WARNING] Invalid POM for javax.jms:jms:jar:1.1, transitive dependencies (if any) will not be available, enable debug logging for more details

Jemmy 發表在 痞客邦 留言(0) 人氣()

  上個月寫個Log4J以類別全名作為檔名的Log檔,每個類別都有自己的Log file。若還要再加個需求是Log File可以Daily Rolling,承襲上次的寫法也不困難:

public class DynaDailyRollingAppender extends DailyRollingFileAppender {

Jemmy 發表在 痞客邦 留言(0) 人氣()

  其實SLF4J學起來還蠻快的。會需要兩個Jar,一是slf4j-api.jar,第二個通常是slf4j-log4j12.jar(用於Log4J 1.2.x版),若想換成Apache的,則把第二個換成slf4j-jcl.jar就可以了。可是要是出現兩個…,slf4j-api應該是先找到第一個為主,沒事就別亂冒險。而NOP則是No OPeration之意。logback則是直接implment slf4j,血統最純。

bindings

Jemmy 發表在 痞客邦 留言(0) 人氣()

  寫了幾年的Java,最弱的部份是Log,現在看來還是差不多。最近在改寫Framework時才對Log4J的用法稍有體會,不然也是渾渾噩噩看別人怎麼配置,自己也跟著配置。

  2006年曾設計Logger Proxy委託天津同事開發,其目的有二:一是預設按class full name產生log檔,二是避開像JBoss本身的log4j.properties影響。這樣做效益有好有壞,壞就壞在Ap Server會記一份,自己又用Proxy記了一份,而且不只如此,移到不同的AP Server或Web Server,因WAR或EAR的目錄結構不同,連帶的Proxy跟著改寫,無法通用。

Jemmy 發表在 痞客邦 留言(0) 人氣()

  2006年委天津開發個LoggerProxy,按class名產出該class的Log檔,也加入可以指定某package以下共用同一個log檔的功能。這在Web Server上運作沒問題,卻在Java Main出現Lock現象。若同A Class hold這個log檔,同package的其他class無法再寫入同一個log檔,是因為使用了不同的Logger Instance。解法是想辦法讓每個class裡的Logger共用同一個Logger的instance,卻衍生一個問題,就是使用%c去顯示package class full name時,該class name是取決於當初Logger.getLogger(clazz)中,所傳的clazz的class name。後來意外發現Logger另一個特性:假設Logger的變數為loggerA,loggerA的%c就是當初傳的clazz(假設名為com.A),若想在%c顯示自己的com.B時,只需按如下方式取得:

  Logger loggerB = loggerA.getLogger("com.B");   // 因為getLogger是static method,透過loggerA.getLogger,loggerB就能得到loggerA屬性

Jemmy 發表在 痞客邦 留言(0) 人氣()