`
snoopy7713
  • 浏览: 1118922 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

关于Felix Log Service

    博客分类:
  • OSGi
 
阅读更多

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 决定是否将调试消息是否保存于历史中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics