日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用LogKit进行日志操作

發(fā)布時(shí)間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用LogKit进行日志操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的原因是:ContextLogTargets。使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。