X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FNodeLogger.java;h=e83d6c10ed9cd42c7af5da29b4ff05425b1229dc;hb=5b5c2b97eee9edd037e198acadf8b416a973863f;hp=1264b2452d6a8ae06e0aa3d9592c9d949350d381;hpb=0a7d938324d33848ac7dc4ef4007c73a714171ee;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java index 1264b2452..e83d6c10e 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java @@ -15,8 +15,10 @@ */ package org.argeo.cms.internal.kernel; +import java.security.SignatureException; import java.util.ArrayList; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; @@ -27,19 +29,30 @@ import java.util.Properties; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.spi.LoggingEvent; -import org.argeo.ArgeoException; -import org.argeo.ArgeoLogListener; -import org.argeo.ArgeoLogger; +import org.argeo.cms.CmsException; import org.argeo.cms.auth.CurrentUser; +import org.argeo.node.ArgeoLogListener; +import org.argeo.node.ArgeoLogger; +import org.argeo.node.NodeConstants; +import org.argeo.osgi.useradmin.UserAdminConf; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.log.LogEntry; +import org.osgi.service.log.LogListener; +import org.osgi.service.log.LogReaderService; +import org.osgi.service.log.LogService; /** Not meant to be used directly in standard log4j config */ -class NodeLogger implements ArgeoLogger { +class NodeLogger implements ArgeoLogger, LogListener { private Boolean disabled = false; @@ -73,6 +86,14 @@ class NodeLogger implements ArgeoLogger { } }; + @SuppressWarnings("unchecked") + public NodeLogger(LogReaderService lrs) { + Enumeration logEntries = lrs.getLog(); + while (logEntries.hasMoreElements()) + logged(logEntries.nextElement()); + lrs.addLogListener(this); + } + public void init() { try { events = new LinkedBlockingQueue(); @@ -88,7 +109,7 @@ class NodeLogger implements ArgeoLogger { logDispatcherThread = new LogDispatcherThread(); logDispatcherThread.start(); } catch (Exception e) { - throw new ArgeoException("Cannot initialize log4j"); + throw new CmsException("Cannot initialize log4j"); } } @@ -108,33 +129,118 @@ class NodeLogger implements ArgeoLogger { // this.layout = layout; // } - public synchronized void register(ArgeoLogListener listener, - Integer numberOfPreviousEvents) { + // + // OSGi LOGGER + // + @Override + public void logged(LogEntry status) { + Log pluginLog = LogFactory.getLog(status.getBundle().getSymbolicName()); + Integer severity = status.getLevel(); + if (severity == LogService.LOG_ERROR) { + // FIXME Fix Argeo TP + if (status.getException() instanceof SignatureException) + return; + pluginLog.error(msg(status), status.getException()); + } else if (severity == LogService.LOG_WARNING) + pluginLog.warn(msg(status), status.getException()); + else if (severity == LogService.LOG_INFO && pluginLog.isDebugEnabled()) + pluginLog.debug(msg(status), status.getException()); + else if (severity == LogService.LOG_DEBUG && pluginLog.isTraceEnabled()) + pluginLog.trace(msg(status), status.getException()); + } + + private String msg(LogEntry status) { + StringBuilder sb = new StringBuilder(); + sb.append(status.getMessage()); + ServiceReference sr = status.getServiceReference(); + if (sr != null) { + sb.append(' '); + String[] objectClasses = (String[]) sr.getProperty(Constants.OBJECTCLASS); + if (isSpringApplicationContext(objectClasses)) { + sb.append("{org.springframework.context.ApplicationContext}"); + Object symbolicName = sr.getProperty(Constants.BUNDLE_SYMBOLICNAME); + if (symbolicName != null) + sb.append(" " + Constants.BUNDLE_SYMBOLICNAME + ": " + symbolicName); + } else { + sb.append(arrayToString(objectClasses)); + } + Object cn = sr.getProperty(NodeConstants.CN); + if (cn != null) + sb.append(" " + NodeConstants.CN + ": " + cn); + Object factoryPid = sr.getProperty(ConfigurationAdmin.SERVICE_FACTORYPID); + if (factoryPid != null) + sb.append(" " + ConfigurationAdmin.SERVICE_FACTORYPID + ": " + factoryPid); + // else { + // Object servicePid = sr.getProperty(Constants.SERVICE_PID); + // if (servicePid != null) + // sb.append(" " + Constants.SERVICE_PID + ": " + servicePid); + // } + // servlets + Object whiteBoardPattern = sr.getProperty(KernelConstants.WHITEBOARD_PATTERN_PROP); + if (whiteBoardPattern != null) + sb.append(" " + KernelConstants.WHITEBOARD_PATTERN_PROP + ": " + + arrayToString((String[]) whiteBoardPattern)); + // RWT + Object contextName = sr.getProperty(KernelConstants.CONTEXT_NAME_PROP); + if (contextName != null) + sb.append(" " + KernelConstants.CONTEXT_NAME_PROP + ": " + contextName); + + // user directories + Object baseDn = sr.getProperty(UserAdminConf.baseDn.name()); + if (baseDn != null) + sb.append(" " + UserAdminConf.baseDn.name() + ": " + baseDn); + + } + return sb.toString(); + } + + private String arrayToString(Object[] arr) { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + for (int i = 0; i < arr.length; i++) { + if (i != 0) + sb.append(','); + sb.append(arr[i]); + } + sb.append('}'); + return sb.toString(); + } + + private boolean isSpringApplicationContext(String[] objectClasses) { + for (String clss : objectClasses) { + if (clss.equals("org.eclipse.gemini.blueprint.context.DelegatedExecutionOsgiBundleApplicationContext")) { + return true; + } + } + return false; + } + + // + // ARGEO LOGGER + // + + public synchronized void register(ArgeoLogListener listener, Integer numberOfPreviousEvents) { String username = CurrentUser.getUsername(); if (username == null) - throw new ArgeoException( - "Only authenticated users can register a log listener"); + throw new CmsException("Only authenticated users can register a log listener"); if (!userListeners.containsKey(username)) { - List lst = Collections - .synchronizedList(new ArrayList()); + List lst = Collections.synchronizedList(new ArrayList()); userListeners.put(username, lst); } userListeners.get(username).add(listener); - List lastEvents = logDispatcherThread.getLastEvents(username, - numberOfPreviousEvents); + List lastEvents = logDispatcherThread.getLastEvents(username, numberOfPreviousEvents); for (LogEvent evt : lastEvents) dispatchEvent(listener, evt); } - public synchronized void registerForAll(ArgeoLogListener listener, - Integer numberOfPreviousEvents, boolean everything) { + public synchronized void registerForAll(ArgeoLogListener listener, Integer numberOfPreviousEvents, + boolean everything) { if (everything) everythingListeners.add(listener); else allUsersListeners.add(listener); - List lastEvents = logDispatcherThread.getLastEvents(null, - numberOfPreviousEvents); + List lastEvents = logDispatcherThread.getLastEvents(null, numberOfPreviousEvents); for (LogEvent evt : lastEvents) if (everything || evt.getUsername() != null) dispatchEvent(listener, evt); @@ -145,11 +251,9 @@ class NodeLogger implements ArgeoLogger { if (username == null)// FIXME return; if (!userListeners.containsKey(username)) - throw new ArgeoException("No user listeners " + listener - + " registered for user " + username); + throw new CmsException("No user listeners " + listener + " registered for user " + username); if (!userListeners.get(username).contains(listener)) - throw new ArgeoException("No user listeners " + listener - + " registered for user " + username); + throw new CmsException("No user listeners " + listener + " registered for user " + username); userListeners.get(username).remove(listener); if (userListeners.get(username).isEmpty()) userListeners.remove(username); @@ -191,7 +295,9 @@ class NodeLogger implements ArgeoLogger { return configuration; } - /** Reloads configuration (if the configuration {@link Properties} is set) */ + /** + * Reloads configuration (if the configuration {@link Properties} is set) + */ protected void reloadConfiguration() { if (configuration != null) { LogManager.resetConfiguration(); @@ -211,36 +317,29 @@ class NodeLogger implements ArgeoLogger { try { log4jLevel = Level.toLevel(level); } catch (Exception e) { - System.err - .println("Log4j level could not be set for level '" - + level + "', resetting it to null."); + System.err.println("Log4j level could not be set for level '" + level + "', resetting it to null."); e.printStackTrace(); level = null; } - if (log4jLevel != null - && !event.getLoggingEvent().getLevel() - .isGreaterOrEqual(log4jLevel)) { + if (log4jLevel != null && !event.getLoggingEvent().getLevel().isGreaterOrEqual(log4jLevel)) { return; } } try { // admin listeners - Iterator everythingIt = everythingListeners - .iterator(); + Iterator everythingIt = everythingListeners.iterator(); while (everythingIt.hasNext()) dispatchEvent(everythingIt.next(), event); if (event.getUsername() != null) { - Iterator allUsersIt = allUsersListeners - .iterator(); + Iterator allUsersIt = allUsersListeners.iterator(); while (allUsersIt.hasNext()) dispatchEvent(allUsersIt.next(), event); if (userListeners.containsKey(event.getUsername())) { - Iterator userIt = userListeners.get( - event.getUsername()).iterator(); + Iterator userIt = userListeners.get(event.getUsername()).iterator(); while (userIt.hasNext()) dispatchEvent(userIt.next(), event); } @@ -253,10 +352,8 @@ class NodeLogger implements ArgeoLogger { protected void dispatchEvent(ArgeoLogListener logListener, LogEvent evt) { LoggingEvent event = evt.getLoggingEvent(); - logListener.appendLog(evt.getUsername(), event.getTimeStamp(), event - .getLevel().toString(), event.getLoggerName(), event - .getThreadName(), event.getMessage(), event - .getThrowableStrRep()); + logListener.appendLog(evt.getUsername(), event.getTimeStamp(), event.getLevel().toString(), + event.getLoggerName(), event.getThreadName(), event.getMessage(), event.getThrowableStrRep()); } private class AppenderImpl extends AppenderSkeleton { @@ -308,11 +405,9 @@ class NodeLogger implements ArgeoLogger { lastEvents.add(loggingEvent); } - public synchronized List getLastEvents(String username, - Integer maxCount) { + public synchronized List getLastEvents(String username, Integer maxCount) { LinkedList evts = new LinkedList(); - ListIterator it = lastEvents.listIterator(lastEvents - .size()); + ListIterator it = lastEvents.listIterator(lastEvents.size()); int count = 0; while (it.hasPrevious() && (count < maxCount)) { LogEvent evt = it.previous();