使用LogKit进行日志操作
1.????? 概述
任何一個(gè)系統(tǒng)中,日志都是不可缺少的,現(xiàn)在Apache提供了兩套日志工具,一個(gè)就是Log4j,另一個(gè)是本文要給出例子的LogKit。
Log4j和LogKit有很多相似的地方。比如,Log4j提供5級(jí)日志:DEBUG、INFO、WARN、ERROR和FATAL,LogKit也提供5級(jí)日志:DEBUG、INFO、WARN、ERROR和FATAL-ERROR,除了級(jí)別5的命名不一樣,實(shí)質(zhì)是一樣的。
LogKit同樣提供目錄功能,而對(duì)日志格式的控制,在Log4j中是使用Layout,而在LogKit中使用的是Formatter。對(duì)于日志輸出,Log4j使用的是Appender,LogKit則使用了更為直接的名字:Target。
這個(gè)文章當(dāng)然不是用來對(duì)比LogKit和Log4j的不同的,而是想說明,為什么在有了Log4j這樣的日志工具以后,還需要使用LogKit。
使用LogKit的原因是:Context和LogTargets。使用Log4j的時(shí)候,日志的內(nèi)容只能是一句話,而使用LogKit,你可以記錄很多項(xiàng)內(nèi)容,甚至可以各項(xiàng)內(nèi)容記錄到對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段中。如果使用Log4j存儲(chǔ)日志到不同的存儲(chǔ)介質(zhì),如數(shù)據(jù)庫(kù),需要使用Appender,而LogKit已經(jīng)可以支持多種存儲(chǔ)目標(biāo)。
下面的程序?qū)⒂靡粋€(gè)產(chǎn)品檢測(cè)線(ProductChecker)作為示范。
2.????? 一個(gè)例子
產(chǎn)品檢測(cè)線是用來檢查產(chǎn)品是否合格使用的,要求記錄產(chǎn)品編號(hào)、產(chǎn)品是否通過檢測(cè)、簡(jiǎn)要說明三個(gè)項(xiàng)目。而LogKit會(huì)把級(jí)別、時(shí)間和信息也記錄下作為參考。
在免費(fèi)的Mysql數(shù)據(jù)庫(kù)上建立logkitexample表的sql語句:
create table logkigexample
(
logmessage varcher(1000),
??????? logpriority varchar(20),
logtime datetime,
productnumber varchar(100),
productpass varchar(10),
productexplain varchar(100)
)
?
在這個(gè)產(chǎn)品檢測(cè)線中,產(chǎn)品是否通過分三種情況:ok、soso和bad。其中,ok代表產(chǎn)品質(zhì)量好,soso代表質(zhì)量一般,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();
??????? //模擬產(chǎn)品檢查的結(jié)果
??????? 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
??????? {
??????????? //登記使用的數(shù)據(jù)源
??????????? Class.forName("org.gjt.mm.mysql.Driver");
??????????? DefaultDataSource _dataSource = new DefaultDataSource("jdbc:mysql://localhost/logkitexample" , "root", "");
??????????? //登記對(duì)應(yīng)的列映射關(guān)系
??????????? 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");
??????????? //設(shè)置ProductChecker的日志記錄器使用的Target
??????????? LoggerProductChecker.setLogTargets(
??????????????? new LogTarget[] {_targetProductChecker});
??????????? //設(shè)置日志級(jí)別為DEBUG
??????????? LoggerProductChecker.setPriority(org.apache.log.Priority.DEBUG);
??????? }
??????? catch (Exception e)
??????? {
??????????? System.out.println("LogKitinit error");
??????? }
??? }
?
??? /** 獲得產(chǎn)品日志的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的存儲(chǔ)目標(biāo)
LogKit支持多種不同的日志存儲(chǔ)目標(biāo),稱為L(zhǎng)ogTargets,包括有文件、數(shù)據(jù)庫(kù)、IRC頻道、JMS,甚至是任意的Sockets定義。
LogKit中一個(gè)日志記錄器可以對(duì)應(yīng)不同的LogTargets,使用Filter可以根據(jù)不同的日志級(jí)別記錄到不同的LogTargets中。比如日志都是存放早數(shù)據(jù)庫(kù)的,但是FATAL_ERROR要存放在文本文件,因?yàn)檫@種情況下,很可能數(shù)據(jù)庫(kù)都是不可用的。
LogKit還支持異步的LogTargets,適用于不能實(shí)時(shí)響應(yīng)的LogTargets,如郵件系統(tǒng)等。
?
4.????? 參考資料
?
LogKit項(xiàng)目主頁:http://jakarta.apache.org/avalon/logkit/index.html
總結(jié)
以上是生活随笔為你收集整理的使用LogKit进行日志操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux驱动基础:msm平台,mode
- 下一篇: 高通msm8994启动流程简介