使用LogKit进行日志操作
1.????? 概述
任何一個系統中,日志都是不可缺少的,現在Apache提供了兩套日志工具,一個就是Log4j,另一個是本文要給出例子的LogKit。
Log4j和LogKit有很多相似的地方。比如,Log4j提供5級日志:DEBUG、INFO、WARN、ERROR和FATAL,LogKit也提供5級日志:DEBUG、INFO、WARN、ERROR和FATAL-ERROR,除了級別5的命名不一樣,實質是一樣的。
LogKit同樣提供目錄功能,而對日志格式的控制,在Log4j中是使用Layout,而在LogKit中使用的是Formatter。對于日志輸出,Log4j使用的是Appender,LogKit則使用了更為直接的名字:Target。
這個文章當然不是用來對比LogKit和Log4j的不同的,而是想說明,為什么在有了Log4j這樣的日志工具以后,還需要使用LogKit。
使用LogKit的原因是:Context和LogTargets。使用Log4j的時候,日志的內容只能是一句話,而使用LogKit,你可以記錄很多項內容,甚至可以各項內容記錄到對應的數據庫字段中。如果使用Log4j存儲日志到不同的存儲介質,如數據庫,需要使用Appender,而LogKit已經可以支持多種存儲目標。
下面的程序將用一個產品檢測線(ProductChecker)作為示范。
2.????? 一個例子
產品檢測線是用來檢查產品是否合格使用的,要求記錄產品編號、產品是否通過檢測、簡要說明三個項目。而LogKit會把級別、時間和信息也記錄下作為參考。
在免費的Mysql數據庫上建立logkitexample表的sql語句:
create table logkigexample
(
logmessage varcher(1000),
??????? logpriority varchar(20),
logtime datetime,
productnumber varchar(100),
productpass varchar(10),
productexplain varchar(100)
)
?
在這個產品檢測線中,產品是否通過分三種情況:ok、soso和bad。其中,ok代表產品質量好,soso代表質量一般,bad代表沒有通過檢查,需要重新制造。
?
代碼如下:
package logkitexample;
?
import java.lang.*;
import java.util.*;
import org.apache.log.*;
import org.apache.log.output.db.*;
?
public class ProductChecker
{
???
??? static private org.apache.log.Logger LoggerProductChecker;
?
??? public static void main(String[] argv)
??? {
??????? ProductChecker _p = new ProductChecker();
??????? _p.initLogKit();
??????? //模擬產品檢查的結果
??????? Random _checkrandom = new Random();
??????? int _checkresult;
??????? for (int i = 1; i <= 20; i++)
??????? {
??????????? _checkresult = (int)(_checkrandom.nextFloat() * 3);
??????????? switch (_checkresult)
??????????? {
??????????????? case 0:
??????????????????? ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "ok", "ok"));
??????????????????? LoggerProductChecker.info("ProductChecker Pass");
??????????????????? break;
??????????????? case 1:
??????????????????? ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "soso", "check again"));
??????????????????? LoggerProductChecker.warn("ProductChecker No Good");
???? ???????????????break;
??????????????? case 2:
??????????????????? ContextMap.bind(_p.getProductCheckerMap("no." + String.valueOf(i), "bad", "redo"));
??????????????????? LoggerProductChecker.error("ProductChecker Bad");
??????????????????? break;
???????? ???}
??????? }
??? }
?
???
??? private void initLogKit()
??? {
??????? try
??????? {
??????????? //登記使用的數據源
??????????? Class.forName("org.gjt.mm.mysql.Driver");
??????????? DefaultDataSource _dataSource = new DefaultDataSource("jdbc:mysql://localhost/logkitexample" , "root", "");
??????????? //登記對應的列映射關系
??????????? ColumnInfo[] _columeProductChecker = {
?????? ??? ?? ?????? new ColumnInfo( "logmessage", ColumnType.MESSAGE, null ),
??? ?????? ????????????? new ColumnInfo( "logpriority", ColumnType.PRIORITY, null ),
??????? ?????? ????new ColumnInfo( "logtime", ColumnType.TIME, null ),
????????????? ??? ?????? new ColumnInfo( "productnumber", ColumnType.CONTEXT,"productnumber" ),
?????? ??????????? new ColumnInfo( "productpass", ColumnType.CONTEXT,"productpass" ),
??? ?????? ????????????? new ColumnInfo( "productexplain", ColumnType.CONTEXT,"productexplain" ),
?????? ?????? ??? };
??????? ?????? //登記JDBCTarget
??????????? DefaultJDBCTarget _targetProductChecker =
??????????????? new DefaultJDBCTarget(_dataSource, "logkitexample", _columeProductChecker);
????????????? ?????? //登記日志的層次
??????????? org.apache.log.Hierarchy _hierarchy = new org.apache.log.Hierarchy();
??????????? LoggerProductChecker = _hierarchy.getLoggerFor("logkitexample");
??????????? //設置ProductChecker的日志記錄器使用的Target
??????????? LoggerProductChecker.setLogTargets(
??????????????? new LogTarget[] {_targetProductChecker});
??????????? //設置日志級別為DEBUG
??????????? LoggerProductChecker.setPriority(org.apache.log.Priority.DEBUG);
??????? }
??????? catch (Exception e)
??????? {
??????????? System.out.println("LogKitinit error");
??????? }
??? }
?
??? /** 獲得產品日志的ContextMap */
??? private org.apache.log.ContextMap getProductCheckerMap(String _ProductNumber, String _ProductPass, String _ProductExplain)
??? {
??????? org.apache.log.ContextMap _cm = new org.apache.log.ContextMap();
??????? _cm.set("productnumber", _ProductNumber);
??????? _cm.set("productpass", _ProductPass);
??????? _cm.set("productexplain", _ProductExplain);
??????? return (_cm);
??? }
}
3.????? LogKit的存儲目標
LogKit支持多種不同的日志存儲目標,稱為LogTargets,包括有文件、數據庫、IRC頻道、JMS,甚至是任意的Sockets定義。
LogKit中一個日志記錄器可以對應不同的LogTargets,使用Filter可以根據不同的日志級別記錄到不同的LogTargets中。比如日志都是存放早數據庫的,但是FATAL_ERROR要存放在文本文件,因為這種情況下,很可能數據庫都是不可用的。
LogKit還支持異步的LogTargets,適用于不能實時響應的LogTargets,如郵件系統等。
?
4.????? 參考資料
?
LogKit項目主頁:http://jakarta.apache.org/avalon/logkit/index.html
總結
以上是生活随笔為你收集整理的使用LogKit进行日志操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux驱动基础:msm平台,mode
- 下一篇: 高通msm8994启动流程简介