Author: michiel
Date: 2009-05-15 15:28:11 +0200 (Fri, 15 May 2009)
New Revision: 35196
Added:
mmbase/trunk/src/org/mmbase/util/logging/BufferedLogger.java
Modified:
mmbase/trunk/src/org/mmbase/util/logging/ChainedLogger.java
Log:
MMB-1811
Added: mmbase/trunk/src/org/mmbase/util/logging/BufferedLogger.java
===================================================================
--- mmbase/trunk/src/org/mmbase/util/logging/BufferedLogger.java
(rev 0)
+++ mmbase/trunk/src/org/mmbase/util/logging/BufferedLogger.java
2009-05-15 13:28:11 UTC (rev 35196)
@@ -0,0 +1,127 @@
+/*
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
+
+The license (Mozilla version 1.0) can be read at the MMBase site.
+See http://www.MMBase.org/license
+
+*/
+package org.mmbase.util.logging;
+import java.util.*;
+import java.io.*;
+import java.util.concurrent.*;
+import java.lang.ref.*;
+
+/**
+ * A Logger that buffers in memory, and on request logs again to a certain
other logger.
+ *
+ * @author Michiel Meeuwissen
+ * @version $Id: WriterLogger.java,v 1.4 2009/03/16 15:17:02 michiel Exp $
+ * @since MMBase-1.9.1
+ */
+
+public class BufferedLogger extends AbstractSimpleImpl {
+
+ private static final Logger LOG =
Logging.getLoggerInstance(BufferedLogger.class);
+
+ protected static List<WeakReference<BufferedLogger>> instances = new
CopyOnWriteArrayList<WeakReference<BufferedLogger>>();
+
+ static {
+ org.mmbase.util.ThreadPools.scheduler.scheduleAtFixedRate(new
Runnable() {
+ public void run() {
+ for (WeakReference<BufferedLogger> ref : instances) {
+ BufferedLogger buffer = ref.get();
+ if (buffer != null) {
+ int cleaned = buffer.cleanup();
+ LOG.debug("Cleaned up " + cleaned + " log entry
from " + buffer);
+
+ }
+ }
+ }
+ },
+ 10,
+ 10, TimeUnit.SECONDS);
+ }
+
+ private final List<LogEntry> history = Collections.synchronizedList(new
LinkedList<LogEntry>());
+
+ private long maxAge = Long.MAX_VALUE;
+ private int maxSize = Integer.MAX_VALUE;
+
+ public BufferedLogger() {
+ instances.add(new WeakReference<BufferedLogger>(this));
+ }
+
+ public void setMaxAge(long ma) {
+ maxAge = ma;
+ }
+ public void setMaxSize(int ms) {
+ maxSize = ms;
+ }
+
+ protected int cleanup() {
+ int tot = 0;
+ while (history.size() > maxSize) {
+ history.remove(0);
+ tot++;
+ }
+ long deleteStamp = System.currentTimeMillis() - maxAge;
+ while (history.get(0).timeStamp.getTime() < deleteStamp) {
+ history.remove(0);
+ tot++;
+ }
+ return tot;
+ }
+
+
+ @Override
+ protected void log(String s, Level level) {
+ LOG.debug("buffering " + level + " " + s);
+ history.add(new LogEntry(s, level));
+ if (history.size() > maxSize) {
+ history.remove(0);
+ }
+ }
+
+ public void reLog(final Logger log, final boolean clear, final Date after)
{
+ synchronized(history) {
+ Iterator<LogEntry> i = history.iterator();
+ while(i.hasNext()) {
+ LogEntry entry = i.next();
+ if (clear) i.remove();
+ if (entry.timeStamp.after(after)) {
+ LOG.debug("Relogging " + log);
+ Logging.log(entry.level, log, entry.line);
+ } else {
+ LOG.debug("Not relogging " + log + " (too old)");
+ }
+ }
+ }
+ }
+ /**
+ * Utitliy function to 'relog' to a String.
+ */
+ public String getList(Level l) {
+ StringWriter w = new StringWriter();
+ reLog(new WriterLogger(w, l), false, new Date(0));
+ return w.toString();
+ }
+ public String getDebugList() {
+ return getList(Level.DEBUG);
+ }
+
+
+ protected class LogEntry {
+ final Date timeStamp = new Date();
+ final String line;
+ final Level level;
+ public LogEntry(String line, Level level) {
+ this.level = level;
+ this.line = line;
+ }
+ }
+
+
+
+
+}
Modified: mmbase/trunk/src/org/mmbase/util/logging/ChainedLogger.java
===================================================================
--- mmbase/trunk/src/org/mmbase/util/logging/ChainedLogger.java 2009-05-15
13:13:20 UTC (rev 35195)
+++ mmbase/trunk/src/org/mmbase/util/logging/ChainedLogger.java 2009-05-15
13:28:11 UTC (rev 35196)
@@ -23,6 +23,8 @@
*/
public class ChainedLogger implements Logger {
+ private static final Logger LOG =
Logging.getLoggerInstance(ChainedLogger.class);
+
private final List<Logger> loggers = new CopyOnWriteArrayList<Logger>();
public ChainedLogger(Logger... ls) {
for (Logger l : ls) {
@@ -89,7 +91,7 @@
public void service (Object m, Throwable t) {
for (Logger log : loggers) {
- log.service(m, t);
+ log.service(m, t);
}
}
@@ -167,5 +169,9 @@
log.setLevel(p);
}
}
+ @Override
+ public String toString() {
+ return "" + loggers;
+ }
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs