关于Felix Log Service

本文深入探讨了OSGi服务纲要规范中的日志服务规范,包括日志服务接口、日志记录方法、日志条目检索、日志监听器创建与注册及Apache Felix日志服务配置,提供了全面的实现指南。

OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服务。这是一个非常简单的规范,没有完全提供通常在企业级日志工具中所具有的功能。但其扩展服务模块可以用于建立相当复杂的日志解决方案。 Felix Log是对于OSGI Log服务规范的一个简单的、基于内存的实现。

日志服务规范中定义了4个主要实体:

•org.osgi.service.log.LogService – 用于记录信息的接口,包括日志级别、日志信息、异常等的服务接口

•org.osgi.service.log.LogReaderService – 用于添加移除LogListener实例,检索最近的日志条目

•org.osgi.service.log.LogEntry – 定义日志条目的接口

•org.osgi.service.log.LogListener – 为日志条目定义监听器的接口

1)访问日志服务

要访问一个LogService实例,需要在OSGi的服务记录(service registry)中寻找它。如下代码片段所示:

public
 class
 Activator
 implements
 BundleActivator
{
    public
 void
 start(
BundleContext context)
 throws
 Exception 
    {
   ServiceReference ref =
 context.
getServiceReference
(
LogService.
class
.
getName
());

        if
 (
ref !=
 null
)

        {
  LogService log =
 (
LogService)
 context.
getService
(
ref);

            // Use the log...        }

    }

    //..

2)使用日志

LogService接口提供了4种方法用于日志记录,如下代码片段所示:

public
 interface
 LogService

{

    //..

    // Log a message specifying a log level

    public
 log
(
int
 level,
 java.
lang
.
String
 message)
  
  
  // Log an exception

    public
 log
(
int
 level,
 java.
lang
.
String
 message,
 java.
lang
.
Throwable
 exception)
  
 
  // Log a message specifying the ServiceReference that generated it

    public
 log
(
ServiceReference sr,
 int
 level,
 java.
lang
.
String
 message)
  
   
 // Log a message specifying the ServiceReference and exception

    public
 log
(
ServiceReference sr,
 int
 level,
 java.
lang
.
String
 message,
 java.
lang
.
Throwable
 exception)
  
}
       

日志的级别定义如下:

LogService.LOG_DEBUG

LogService.LOG_INFO

LogService.LOG_WARNING

LogService.LOG_ERROR

3)检索日志条目(log entry)

LogReaderService提供getLog()方法用于检索回一个最近使用的日志条目的列举。如下代码片段展示如何从服务记录中检索它:

ServiceReference ref =
 context.
getServiceReference
(
LogReaderService.
class
.
getName
());

if
 (
ref !=
 null
)

{
    LogReaderService reader =
 (
LogReaderService)
 context.
getService
(
ref);
      
    Enumeration<
LogEntry>
 latestLogs =
 reader.
getLog
();
 }

4)创建并注册一个LogListener

日志服务规范并没有定义任何特别的要存储的条目,或对日志条目进行写;这个功能是由开发者自行定义实现的。为了创建这样的一个bundle,第一步是创建LogListener这个接口的实现,如下代码片段展示了一个回显日志信息的简单实现:

public
 class
 LogWriter
 implements
 LogListener
{

    // Invoked by the log service implementation for each log entry

    public
 void
 logged
(
LogEntry entry)
 
    {

        System.
out
.
println
(
entry.
getMessage
());

    }

}

唯一需要实现的方法是logged(),每一次当一个日志条目在相关日志服务中被创建的时候,这方法将被调用。一个LogListener接口的实现必须与LogReaderService注册才能开始检索日志条目,如下所示:

ServiceReference ref =
 context.
getServiceReference
(
LogReaderService.
class
.
getName
());

if
 (
ref !=
 null
)

{

    LogReaderService reader =
 (
LogReaderService)
 context.
getService
(
ref);

    reader.
addLogListener
(
new
 LogWriter());

}

5)设置 Apache Felix 日志服务

Apache Felix日志服务的bundle对Felix没有任何特定依赖,因此它可以在任何OSGi container上运行。也是通过键值对进行配置;对于它的配置,将使用如下两个可选的系统属性:

Property Default Description org.apache.felix.log.maxSize 100 日志历史的最大值,-1表示没有上限,0表示没有历史记录需要被保留。 org.apache.felix.log.storeDebug false 决定是否将调试消息是否保存于历史中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值