首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Cassandra Dev 三:Cassandra 应用之CassandraAppender

2012-10-13 
Cassandra Dev 3:Cassandra 应用之CassandraAppender??? 本文的目的是展示一个测试结果:Cassandra应用的高

Cassandra Dev 3:Cassandra 应用之CassandraAppender

??? 本文的目的是展示一个测试结果:Cassandra应用的高效性,稳定性,可靠性。具体:应用Cassandra记录Application运行中的日志。

????首先说明在一个Application中,不管是它在运行过程,还是在它的开发过程中,记录日志是非常有必要的,特别是一些Service-Based Application或Distributed系统。通过日志,Application的维护人员和开发人员可以更好的完成他们的工作。Log4j是一个很好的日志记录开源工具包,它可以将日志记录到文件系统、从Console输出、发送到指定邮箱等等。本文就是先对Log4j做一扩展,写一个自己的CassandraAppender,使其具有将日志保存到Cassandra的功能。具体实现Log4j定义的Appender……,如下

1. 首先Log4j结构:

?Log4j包括三个主要组件:

????????? Logger:用来记录日志,可以对她指定记录级别(ALL,DEBUG,INFO,WARN,ERROR,FATA);

????????? Layout:设置日志记录样式;

????????? Appender:指定日志输出位置。

这里主要研究Appender,先看下图:

??
Cassandra Dev 三:Cassandra 应用之CassandraAppender

?

????? 如图所示为Appender主要UML类图,AppenderSkeleton为抽象类,它实现了 org.apache.log4j.Appenderorg.apache.log4j.spi.OptionHandler 接口,所有的 appender 都必须扩展org.apache.log4j.AppenderSkeleton 类,

当然我们这里的CassandraAppender就是通过继 AppenderSkeleton来实现的 。在抽象类AppenderSkeleton中定义了抽象方法:

abstract protected void append(LoggingEvent event);

?

?所有的子类都要事先此方法,此方法中参数LoggingEvent代表日志信息,可以通过它获取日志名字,LoggerInfo等,此类还定义一方法:

public void activateOptions() { }

?

?如果需要对某些参数做一处理,本文中CassandraAppender就是在此方法中初始化Thrift RPC连接;

2. Appender生命周期,如下图:


Cassandra Dev 三:Cassandra 应用之CassandraAppender
???? appender 实例不存在。或许框架还没有配置好。

???? 框架实例化了一个新的 appender。这发生在配置器类分析配置脚本中的一个 appender 声明的时候。配置器类调用 Class.newInstanceYourCustomAppender.class) ,这等价于动态调用 new YourCustomAppender() 。框架这样做是为了避免被硬编码为任何特定的?appender 名称;框架是通用的,适用于任何 appender。

?? 框架判断 appender 是否需要 layout。如果该 appender 不需要 layout,配置器就不会尝试从配置脚本中加载 layout 信息。


Cassandra Dev 三:Cassandra 应用之CassandraAppender
?如图CassandraAppender处于就绪状态时,将系统日志发送到Cassandra服务器是它的唯一任务,具体我给出源代码:

?? Log4j 配置器调用 setter 方法。在所有属性都已设置好之后,框架就会调用这个方法。我们可以在这里激活必须同时激活的属性。

?? 配置器调用 activateOptions() 方法。在所有属性都已设置好之后,框架就会调用这个方法。程序员可以在这里激活必须同时激活的属性。

?? Appender 准备就绪。 此刻,框架可以调用 append() 方法来处理日志记录请求。这个方法由 AppenderSkeleton.doAppend() 方法调用。

?? 最后,关闭appender。 当框架即将要删除您的自定义 appender 实例时,它会调用您的 appender 的 close() 方法。 close() 是一个清理方法,意味着 您需要释放已分配的所有资源。它是一个必需的方法,并且不接受任何参数。它必须把 closed 字段设置为 true ,并在有人尝试使用关闭的 appender 时向框架发出警报。

?

3. 扩展自己的Appender

如下图所示为CassandraAppender工作原理:

?

?4. 测试

首先在配置Log4j日志文件log4j.xml如下:

?

?然后运行自己测试类:

?

?接着到Cassandra查看结果,可以用Cassandra Thrift访问(我会就Cassandra Client有专门Blog)



?

?

?

?

?

?


?

热点排行