欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于Felix Log Service

程序员文章站 2022-05-26 23:18:27
...

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