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的原因是:ContextLogTargets。使用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进行日志操作相关推荐

  1. Java日志操作总结

    Java日志操作总结 (2008-04-21 17:39:06) 标签: 杂谈   .  使用Jakarta Commons Logging(JCL) 1.1. 概述 Apache的开源日志组件Jak ...

  2. 使用Log4j进行日志操作(牛小浩)不错的

    使用Log4j进行日志操作   一.Log4j简介   (1)概述 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是 ...

  3. python中的日志操作和发送邮件

    1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...

  4. 使用Log4j进行日志操作

    使用Log4j进行日志操作 英文原文 内容: 1. 概述   1.1. 背景   1.2. Log4j简介 2.一个简单的例子   2.1. 不使用Log4j   2.2. 迁移到Log4j   2. ...

  5. openresty ngx_lua日志操作

    openresty ngx_lua日志操作 日志操作 ngx.log:向日志文件输出日志 语法格式:ngx.log(log_level, ...)环境:init_by_lua*, init_worke ...

  6. C++ 使用Poco库实现日志操作

    C++ 使用Poco库实现日志操作 flyfish 文章目录 C++ 使用Poco库实现日志操作 日志输出到文件 日志输出到控制台 日志同时输出到文件和控制台 示例:将异常输出到日志 日志输出到文件 ...

  7. syslog(),closelog()与openlog()--日志操作函数

    为了满足某些目的,进行日志记录是很有必要的. 在典型的 LINUX 安装中,/var/log/messages 包含所有的系统消息,/var/log/mail 包含来自邮件系统的其它日志消息, /va ...

  8. 0x84bb0001 sqlserver_sqlserver 实现收缩数据库日志操作

    说明: 收缩日志的原因有很多种,有些是考虑空间不足,有些则是应用程序限制导致的. --将"恢复模式"设置为"简单" ALTER DATABASE xszzxt_ ...

  9. C语言日志操作类实例

    包含三个主要的文件:joefunction.h(c), m.c(主函数文件) 1. m.c #include <stdio.h> #include <string.h> #in ...

最新文章

  1. C++ main函数中参数argc和argv
  2. Vue 组件库 HeyUI@1.17.0 发布,新增 Skeleton 组件
  3. Netron开发快速上手(一):GraphControl,Shape,Connector和Connection
  4. 强悍的远程桌面管理器
  5. 无密码身份验证:安全、简单且部署快速
  6. python selenium webdriver方法封装(find_element_by)
  7. dev 命令行参数调用_云开发·云调用生成小程序码
  8. vue 3.4x以上如何改变项目运行端口号
  9. react dispatch_React系列自定义Hooks很简单
  10. Eureka缓存机制
  11. 计算机网络自查分析报告,网络安全自查报告
  12. 分裂对象模型和TclCL(2)
  13. PHP过滤HTML标签的三种方法
  14. 什么的SIT测试?什么是UAT测试?
  15. 数字电路基础知识—— IO外设之GPIO介绍
  16. 即时通讯服务服务器 ejabberd、jabber、jabberd、xmpp简介
  17. 人的声音是可以通过训练而改变的吗?
  18. StarUML画流程图
  19. 有太多工作要做,传蚂蚁集团IPO可能推迟至2022年
  20. 网站存储服务器搭建,如何部署一个最基本的数据存储服务器

热门文章

  1. python正则表达式模块_Python正则表达式函数模块
  2. JSON 对象和字符串对象的互转
  3. vue展示信息卡片_vue实现登录和个人信息组件展示
  4. 计算机网络中什么叫总衰耗_1、什么是计算机网络?
  5. u盘扩容软件_扩容盘的认识与检测和量产还原
  6. Android Support Library 24.2.0 正式发布
  7. 重启修复计算机怎么操作,如何以安全模式启动电脑,修复系统故障,这4个方法值得一试...
  8. linux 关闭磁盘检测,linux下检测磁盘状态
  9. matlab中jet的例子,Python matplotlib.pyplot.jet()用法及代码示例
  10. android 线性布局 底部,java – 如何在android线性布局中对齐父底部?