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. mysql 查看 删除 日志操作总结(包括单独和主从mysql)

    我们可以在mysql的安装目录下看到mysql的二进制日志文件,如mysql-bin.000***等,很多人都不及时的处理,导致整个硬盘被塞满也是有可能的.这些是数据库的操作日志.它记录了我们平时使用 ...

  2. SQL Server 最小化日志操作解析,应用

    Sql Server 中数据库在BULK_LOGGED/SIMPLE模式下的一些操作会采用最小化日志的记录方式,以减小tran log落盘日志量从而提高整体性能. 这里我简单介绍下哪些操作在什么样的情 ...

  3. 使用Log4j进行日志操作

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

  4. SQL Server 最小化日志操作解析,应用[手稿]

    Sql Server 中数据库在BULK_LOGGED/SIMPLE模式下的一些操作会采用最小化日志的记录方式,以减小tran log落盘日志量从而提高整体性能. 这里我简单介绍下哪些操作在什么样的情 ...

  5. xBIM 日志操作

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

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

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

  7. 从零开始的Python学习Episode 14——日志操作

    日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 ...

  8. Java 使用Log4J进行日志操作

    使用Log4J进行日志操作   Log4J简介   Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT ...

  9. Python之日志操作(logging)

    import logging   1.自定义日志级别,日志格式,输出位置 logging.basicConfig( level=logging.DEBUG, format='%(asctime)s | ...

随机推荐

  1. Docker 控制组

    控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离.限制.审计等.只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争. 控制组技术最早是由 Go ...

  2. JavaScript 字符串(String)对象

    String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...

  3. Spring完全基于Java配置和集成Junit单元测试

    要点: 配置继承WebApplicationInitializer的类作为启动类,相当于配置web.xml文件 使用@Configuration注解一个类,在类中的方式使用@Bean注解,则表名该方法 ...

  4. Dynamics CRM 不同的站点地图下设置默认不同的仪表板

    CRM的默认仪表板只能设置一个,也就是说每个引用仪表板的站点地图下点开仪表板后都是看到的默认仪表板,例如我下图中的"日常维修仪表板" 那如果我要在不同的站点地图下看到的默认仪表板不 ...

  5. 一个貌似比较吊的递归转换为loop--总算成功了.--第二弹

    前段时间用类似于散弹式编程的方式,各种猜测-运行验证-修正结果,最终成功转换了一个看起来比较有难度的递归函数.但总觉得很蛋疼,原因如下: 1.虽然正确,但是逻辑搞得比较复杂.现在去看,一头雾水,不知道 ...

  6. Redis集群功能预览

    目前Redis Cluster仍处于Beta版本,Redis 3.0将会加入,在此可以先对其主要功能和原理进行一个预览.参考<Redis Cluster - a pragmatic approa ...

  7. Redis 学习笔记4: Redis 3.2.1 集群搭建

    在CenOS 6.7 linux环境下搭建Redis 集群环境 1.下载最新的Redis版本 本人下载的Redis版本是3.2.1版本,下载之后,解压,编译(make): 具体操作可以参考我的博文:R ...

  8. TortoiseSVN使用

    TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费. TortoiseSVN是 Subversion 的 Windows 扩展.它使你避免接触 Subv ...

  9. SQL Server 索引维护(1)——系统常见的索引问题

    前言: 在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次D ...

  10. Ubuntu 安装 texlive2013 及中文支持

    分享一下安装和配置经验. 1.材料准备 texlive的安装包:可以百度下,这里也提供一个下载地址: http://mirror.hust.edu.cn/CTAN/systems/texlive/Im ...