darks-logs是一款Android、JAVA、WEB通用的日誌組件,它的配置方式類似於log4j,但是它具有更加輕量級、易用性更高、高擴充性、支援移動端等特點。根據官網所述,它的最初設計目標是為JAVA、WEB應用與移動端的互相移植提供統一有效日誌組件庫。
項目開源地址
項目發布地址
一、設定檔
在使用darks-logs之前,我們需要為它建立一個名叫logd.properties的設定檔。如果你是需要在JAVA或WEB上使用該組件,那麼你可以像配置log4j一樣將它放在classpath中。
如果是在Android端使用該組件,你需要將logd.properties檔案放置在assets目錄中,以便能讓組件找到它。在放置了logd.properties檔案後,為了能讓組件擷取到assets目錄中的設定檔,需要在Android的Application中進行相關的設定。如果需要日誌輸出捕獲的Android應用ANR異常資訊,也需要在Application中註冊ANR異常處理器。
public class CustomApplication extends Application{ @Override public void onCreate() { //首先必須設定Application對象 Logger.Android.setApplication(this); //註冊ANR錯誤處理器 Logger.Android.registerCrashHandler(); super.onCreate(); }}
如果希望Android應用在捕獲到ANR異常後,能回調執行相關的代碼,可以在registerCrashHandler方法中設定CallBack。
Logger.Android.registerCrashHandler(new CallBack(){ @Override public boolean handleMessage(Message msg) { //發生ANR異常時執行 new Thread() { public void run() { Looper.prepare(); Toast.makeText(CustomApplication.this, "The crash has happened.", Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); Thread.sleep(3000); return true; } });
預設的設定檔載入器會從Java的classpath以及Android的assets中載入設定檔,如果你需要從其他特別的地方載入設定檔(例如sdcard、raw等等) 。你可以自訂載入器,並通過Logger.Config.setCustomLoader(...)進行設定。在後續版本中會增加載入路徑的自訂設定,從而不需要自訂載入器,除非你有特別需求。
二、簡單使用
在完成設定檔的放置及必要的參數配置後,我們就可以向設定檔中添加配置參數了。
我們先簡單的向logd.properties中添加一個控制台Tlog器。
logd.root=info,console#logd.appender.console=darks.log.appender.impl.ConsoleAppenderlogd.appender.console=ConsoleAppenderlogd.appender.console.layout=PatternLayoutlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
然後我們在JAVA類中建立一個logger,為了提高效率建議設定成static變數。
static Logger log = Logger.getLogger(TestLogger.class);static Logger log = Logger.getLogger("darks.logs.test.TestLogger");static Logger log = Logger.getLogger("TestLogger");
之後我們可以通過多種方式輸出不同記錄層級的日誌資訊。
log.debug("This is the darks logs hello world.");log.info("Info message will be output");log.error("Happen a exception. Cause " + e.getMessage(), e);
如果你需要進行比較多的字串拼接,或者對部分日誌資訊進行格式化。這樣的輸出方式可以提高一部分效率。
log.append("darks").append('-').append("logs").info();log.append(2014).append(1).append(1).debug(e);log.buffer(2014, " coming ", "now").warn();log.format("darks-logs was created in %d by %s", 2014, "darks").error(e);log.append("...").append("...").format("...", ...).info();
三、日誌訊息格式化 在簡單使用中我們設定了一個控制台日誌輸出器,其中配置了
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
這段配置資訊是為了配置當前訊息輸出器的日誌格式。相關的格式定義如下。
%n, %N: 輸出一個斷行符號字元。%m, %M: 輸出訊息內容。(也包括異常棧資訊)%e, %E: 輸出錯誤異常棧資訊。%d, %D: 輸出日期格式資訊,例如 "%d{yyyy-MM-dd HH:mm:ss}".%c: 輸出命名空間或者tags.我們可以使用%c{層數}來輸出命名空間中指定的資訊。 例如%c{1},如果命名空間是 darks.log.DemoMain,那麼它會輸出DemoMain。%C: 輸出類名.你也可以使用%C{層數}的方式來輸出類名的指定層數。 例如%C{2},如果類全名是darks.log.DemoMain,那麼它會輸出log.DemoMain。%f, %F: 輸出源檔案名稱。%L: 輸出原始碼行數。%l: 輸出時間資訊。包括調用類,線程名,源檔案名稱以及程式碼數。%p, %P: 輸出記錄層級。%r, %R: 輸出從啟動到現在的消耗時間。%t, %T: 輸出當前線程名。
例如:
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%f][%p] - %m%nlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{2} - %m%n
四、訊息處理器 Appender是所有訊息處理器的基類,它可以配置layout、filter等等,你可以通過繼承該類去自訂化輸出,比如將日誌輸出到Android的UI上。
1、layout
layout主要用來格式化訊息,你可以使用內建的darks.log.PatternLayout, darks.log.SimpleLayout等layout,你甚至可以繼承LoggerLayout自訂實現layout。
PatternLayout能夠靈活的通過輸出格式輸出日誌資訊。例如%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n。
SimpleLayout能夠輸出較為簡單的日誌I型逆襲。例如:level - message
2、filter filter能夠通過指定的規則過濾日誌訊息。
LevelRangeFilter能夠輸出最小等級與最大等級之間的日誌訊息。
#它將會輸出debug與info等級之間的訊息logd.appender.console=ConsoleAppenderlogd.appender.console.layout=PatternLayoutlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%nlogd.appender.console.filter=LevelRangeFilterlogd.appender.console.filter.levelMin=debuglogd.appender.console.filter.levelMax=infologd.appender.console.filter.accept=true
RegexMatchFilter能夠輸出匹配指定的Regex的日誌訊息。
#它將會輸出匹配Regexdarks\d+的日誌訊息logd.appender.console=ConsoleAppenderlogd.appender.console.layout=PatternLayoutlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%nlogd.appender.console.filter=RegexMatchFilterlogd.appender.console.filter.pattern=darks\d+logd.appender.console.filter.accept=true
LevelMatchFilter能夠輸出制定日誌等級的訊息日誌。多個等級之間用逗號隔開。
#它將會輸出debug以及info層級的訊息日誌logd.appender.console=ConsoleAppenderlogd.appender.console.layout=PatternLayoutlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%nlogd.appender.console.filter=LevelMatchFilterlogd.appender.console.filter.levels=debug,infologd.appender.console.filter.accept=true
3、async 設定了async的Tlog器能夠非同步將日誌訊息輸出到Tlog器中。
logd.appender.console.async=true
五、各類訊息處理器
1、ConsoleAppender ConsoleAppender能夠輸出日誌訊息到命令控制台。
logd.appender.console=ConsoleAppenderlogd.appender.console.layout=PatternLayoutlogd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
2、AndroidAppender AndroidAppender能夠輸出訊息到Android的logcat。
logd.appender.ANDROID=AndroidAppender#輸出命名空間的指定層數作為logcat的TAG。預設為1.logd.appender.ANDROID.layer=1logd.appender.ANDROID.layout=PatternLayoutlogd.appender.ANDROID.layout.pattern=%m
3、StreamAppender StreamAppender是流式輸出的基礎類。你不能直接的使用它,而是必須建立一個繼承於它的類去實現流式的輸出。你能夠使用它將訊息輸出到檔案、網路等地方。
public class CustomAppender extends StreamAppender{ @Override public void activateHandler() { //會在第一次啟用時調用,你可以用他建立檔案或者初始化IO流等。 } @Override protected void expandAppend(LogMessage msg, String log) throws Exception { //在這裡做日誌的擴充處理,比如檢查檔案大小等等 }}
4、SocketAppender SocketAppender能夠通過TCP協議輸出日誌訊息到服務端。它繼承於StreamAppender。
logd.appender.SOCKET=SocketAppenderlogd.appender.SOCKET.layout=PatternLayoutlogd.appender.SOCKET.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n#服務端IPlogd.appender.SOCKET.serverHost=127.0.0.1#服務端連接埠logd.appender.SOCKET.serverPort=8686#保持alivelogd.appender.SOCKET.keepAlive=truelogd.appender.SOCKET.tcpNoDelay=true#用頭位元組封裝訊息,它會給傳輸的日誌訊息加上前置標識以及訊息長度。logd.appender.SOCKET.wrapBytes=true
5、FileAppender FileAppender能夠輸出日誌訊息到檔案。它繼承於StreamAppender。如果你想建立動態檔案名稱,你可以使用${PROPERTY_VARIABLE}獲得System.getProperty的值。如果你想獲得Android的SDCARD目錄,你可以通過${sdcard}去獲得sdcard的絕對路徑。如果你想在檔案名稱上加上日期或者時間,你可以使用${D[日期格式]},例如${Dyyyy_MM_dd_HH_mm_ss}。
logd.appender.FILE=FileAppenderlogd.appender.FILE.layout=PatternLayoutlogd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%nlogd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt#logd.appender.FILE.fileName=${sdcard}/log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txtlogd.appender.FILE.buffered=true.
6、FileDateSizeAppender FileDateSizeAppender能夠保證記錄檔在指定的大小及日期範圍內。它的記錄檔預設保留時間為7天,它的預設保留大小為10MB,如果超出指定大小將建立一個記錄檔。它的相關屬性繼承於FileAppender。
logd.appender.FILE=FileDateSizeAppenderlogd.appender.FILE.layout=PatternLayoutlogd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%nlogd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txtlogd.appender.FILE.buffered=truelogd.appender.FILE.maxSize=10485760logd.appender.FILE.keepDay=7