关于Felix Log Service
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 决定是否将调试消息是否保存于历史中。
推荐阅读
-
关于Android的Service知识点,你知道吗?
-
关于Oracle的log_buffer该设为多大的问题分析
-
关于xampp中无法启动mysql,Attempting to start MySQL service...的解决办法!!
-
关于Laravel Service Provider开发设置延迟加载时遇到的问题详解
-
详解关于mybatis-plus中Service和Mapper的分析
-
关于运行ssm环境maven插件tomcat时出现的log4j:WARN No appenders could be found for logger
-
关于Android中log日志(LogUtil)的封装
-
关于access_log 日志文件以及ip、uv和pv的定义
-
关于Spring Boot项目的 log4j2 核弹漏洞问题(一行代码配置搞定)
-
关于IDEA 2020使用 mybatis-log-plugin插件的问题