diff --git a/osgi.enroute.logger.simple.provider/bnd.bnd b/osgi.enroute.logger.simple.provider/bnd.bnd index 2a725da..e089f19 100644 --- a/osgi.enroute.logger.simple.provider/bnd.bnd +++ b/osgi.enroute.logger.simple.provider/bnd.bnd @@ -30,8 +30,10 @@ Conditional-Package: aQute.lib* LICENSE.txt --runrequires: \ - osgi.identity;filter:='(osgi.identity=osgi.enroute.logger.simple.provider)' +-runrequires: \ + osgi.identity;filter:='(osgi.identity=osgi.enroute.logger.simple.provider)',\ + osgi.identity;filter:='(osgi.identity=osgi.enroute.gogo.shell.provider)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)' -fixupmessages: \ "Export org.slf4j*, has 1, private references \\[org.slf4j.spi\\]", \ @@ -41,3 +43,13 @@ Conditional-Package: aQute.lib* Import-Package: \ aQute.bnd.annotation.metatype;resolution:=optional,\ * +-runbundles: \ + org.apache.felix.configadmin;version='[1.8.6,1.8.7)',\ + org.apache.felix.gogo.command;version='[0.14.0,0.14.1)',\ + org.apache.felix.gogo.runtime;version='[0.16.2,0.16.3)',\ + org.apache.felix.log;version='[1.0.1,1.0.2)',\ + org.apache.felix.scr;version='[2.0.0,2.0.1)',\ + org.eclipse.equinox.metatype;version='[1.4.100,1.4.101)',\ + org.osgi.service.metatype;version='[1.3.0,1.3.1)',\ + osgi.enroute.gogo.shell.provider;version=snapshot,\ + osgi.enroute.logger.simple.provider;version=snapshot \ No newline at end of file diff --git a/osgi.enroute.logger.simple.provider/src/osgi/enroute/logger/simple/provider/LoggerAdminImpl.java b/osgi.enroute.logger.simple.provider/src/osgi/enroute/logger/simple/provider/LoggerAdminImpl.java index 9919bbe..ef86983 100644 --- a/osgi.enroute.logger.simple.provider/src/osgi/enroute/logger/simple/provider/LoggerAdminImpl.java +++ b/osgi.enroute.logger.simple.provider/src/osgi/enroute/logger/simple/provider/LoggerAdminImpl.java @@ -26,8 +26,12 @@ import org.osgi.service.component.annotations.ServiceScope; import org.osgi.service.log.LogService; import org.osgi.service.metatype.annotations.Designate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import aQute.bnd.annotation.headers.ProvideCapability; +import aQute.lib.converter.Converter; +import aQute.lib.strings.Strings; import aQute.libg.glob.Glob; import osgi.enroute.debug.api.Debug; import osgi.enroute.logger.api.Level; @@ -39,6 +43,7 @@ * This is the Logger Admin component. It registers a {@link LoggerAdmin} * service. */ +// @formatter:off @ProvideCapability(ns=ImplementationNamespace.IMPLEMENTATION_NAMESPACE, name=LoggerConstants.LOGGER_SPECIFICATION_NAME, version=LoggerConstants.LOGGER_SPECIFICATION_VERSION) @Designate(ocd=Configuration.class) @Component( @@ -51,17 +56,19 @@ Debug.COMMAND_FUNCTION + "=add", Debug.COMMAND_FUNCTION + "=remove", Debug.COMMAND_FUNCTION + "=settings", - Debug.COMMAND_FUNCTION + "=list" + Debug.COMMAND_FUNCTION + "=list", + Debug.COMMAND_FUNCTION + "=slf4j" }) +// @formatter:on public class LoggerAdminImpl extends Thread implements LoggerAdmin, Eval { - - final static int LOG_TRACE = LogService.LOG_DEBUG + 1; + final static Logger logger = LoggerFactory.getLogger(LoggerAdminImpl.class); + final static int LOG_TRACE = LogService.LOG_DEBUG + 1; boolean traces; PrintStream out = System.err; final List> logReferences = new CopyOnWriteArrayList<>(); final List logs = new CopyOnWriteArrayList<>(); - final Map controls = new ConcurrentHashMap<>(); + final Map controls = new ConcurrentHashMap<>(); Control control = new Control(); Settings settings = new Settings(); JavaUtilLoggingHandler javaUtilLogging; @@ -166,25 +173,24 @@ public void run() { n += take.reference == null ? 0 : 2; switch (n) { - case 0 : - log.log(take.level, take.message); - break; + case 0: + log.log(take.level, take.message); + break; - case 1 : - log.log(take.level, take.message, take.exception); - break; + case 1: + log.log(take.level, take.message, take.exception); + break; - case 2 : - log.log(take.reference, take.level, take.message); - break; + case 2: + log.log(take.reference, take.level, take.message); + break; - case 3 : - log.log(take.reference, take.level, take.message, take.exception); - break; + case 3: + log.log(take.reference, take.level, take.message, take.exception); + break; } - } - catch (Exception e) { + } catch (Exception e) { // // Hmm, not much we can do here ... // Since we're the logging subsystem @@ -192,19 +198,17 @@ public void run() { e.printStackTrace(); } } - } - catch (InterruptedException e) { + } catch (InterruptedException e) { interrupt(); return; } - } - catch (Exception e) { + } catch (Exception e) { // // Hmm, not much we can do here ... // e.printStackTrace(); + } finally { } - finally {} } private List getLogs(Entry take) throws InvalidSyntaxException { @@ -213,9 +217,9 @@ private List getLogs(Entry take) throws InvalidSyntaxException { List logs = new ArrayList<>(); BundleContext ctx = take.source.getBundleContext(); - if ( ctx == null) + if (ctx == null) return this.logs; - + for (ServiceReference ref : ctx.getServiceReferences(LogService.class, null)) { LogService service = ctx.getService(ref); if (service != null) @@ -237,7 +241,7 @@ public void eval(AbstractLogger msf) { * Called by an Abstract Logger when it is initing. */ Control getControl(String identifier) { - for (java.util.Map.Entry p : controls.entrySet()) { + for (java.util.Map.Entry p : controls.entrySet()) { if (p.getKey().matcher(identifier).matches()) return p.getValue(); } @@ -268,9 +272,11 @@ public void eval(AbstractLogger msf) { }); return infos; } + public List list() throws Exception { return list("*"); } + /* * Get the current settings */ @@ -284,14 +290,13 @@ public Settings getSettings() throws Exception { */ @Override public void setSettings(Settings settings) throws Exception { - Map controls = new HashMap<>(); + Map controls = new HashMap<>(); for (Control c : settings.controls) { try { Pattern p = Glob.toPattern(c.pattern); controls.put(p, c); - } - catch (Exception ee) { + } catch (Exception ee) { error("Invalid filter " + c.pattern, ee); return; } @@ -321,24 +326,24 @@ private void error(String string, Exception ee) { * set of options: stacktrace, where * @return the Control added */ - public Control add(Glob pattern, Level level, String... options) throws Exception { + public Control add(Glob pattern, String level, String... options) throws Exception { Settings settings = getSettings(); Control control = new Control(); - control.level = level; + control.level = toLevel(level); control.pattern = pattern.toString(); for (String option : options) { switch (option) { - case "stacktrace" : - control.stackTraces = true; - break; + case "stacktrace": + control.stackTraces = true; + break; - case "where" : - control.where = true; - break; + case "where": + control.where = true; + break; - default : - System.err.println("Unknown option " + option); - break; + default: + System.err.println("Unknown option " + option); + break; } } settings.controls.add(control); @@ -346,6 +351,10 @@ public Control add(Glob pattern, Level level, String... options) throws Exceptio return control; } + private Level toLevel(String level) throws Exception { + return Converter.cnv(Level.class, level.toUpperCase()); + } + /** * Shell command to remove a control * @@ -369,10 +378,50 @@ public List remove(Glob pattern) throws Exception { return deleted; } + /** + * Create a log event + * + * @param log + * @throws Exception + */ + + public void slf4j(String level, String... msg) throws Exception { + Level l = toLevel(level); + String s = Strings.join(" ", msg); + if ( s.isEmpty()) + s = level; + + switch(l) { + case AUDIT: + logger.error("{}",s); + break; + case DEBUG: + logger.debug("{}",s); + break; + default: + case R1: + case R2: + case R3: + case ERROR: + logger.error("{}",s); + break; + case INFO: + logger.info("{}",s); + break; + + case TRACE: + logger.trace("{}",s); + break; + case WARN: + logger.warn("{}",s); + break; + } + } + /* * Get the log services */ - @Reference(cardinality=ReferenceCardinality.MULTIPLE, policy=ReferencePolicy.DYNAMIC, service = LogService.class) + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC, service = LogService.class) void addLog(ServiceReference log) { latch.countDown(); logReferences.add(log); @@ -388,7 +437,7 @@ void removeLog(ServiceReference log) { /* * Get the log services */ - @Reference(cardinality=ReferenceCardinality.MULTIPLE, policy=ReferencePolicy.DYNAMIC) + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC) void addLogService(LogService log) { latch.countDown(); logs.add(log);