
Author: seb Date: Wed Sep 6 15:38:42 2006 New Revision: 515 Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextSer.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextView.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerSer.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerView.java Modified: logback/trunk/logback-classic/doc/designDiscussion/LoggingEvent Serialization.odt logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/MockSocketServer.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SerializationPerfsTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java Log: Initial Commit: design change - work in progress. - Added two interfaces LoggerView and LoggerContextView. - Logger, LoggerSer and LoggerContext, LoggerContextSer implements these interfaces, respectively. - LoggerSer and LoggerContextSer are the serialized versions of Logger and LoggerContext. - Committing a few more classes that were impacted by these changes. - Updated test classes. Modified: logback/trunk/logback-classic/doc/designDiscussion/LoggingEvent Serialization.odt ============================================================================== Binary files. No diff available. Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java Wed Sep 6 15:38:42 2006 @@ -17,7 +17,6 @@ import java.util.List; import org.slf4j.Marker; -import org.slf4j.impl.MessageFormatter; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; @@ -26,7 +25,7 @@ import ch.qos.logback.core.spi.AppenderAttachableImpl; -public final class Logger implements org.slf4j.Logger, AppenderAttachable, Serializable { +public final class Logger implements org.slf4j.Logger, LoggerView, AppenderAttachable, Serializable { /** * @@ -689,7 +688,15 @@ * Return the context for this logger. * @return */ - public LoggerContext getLoggerContext() { + public LoggerContextView getLoggerContext() { return loggerContext; } + + public LoggerSer getLoggerSer() { + LoggerSer loggerSer = new LoggerSer(); + loggerSer.level = level; + loggerSer.name = name; + loggerSer.loggerContext = loggerContext.getLoggerContextSer(); + return loggerSer; + } } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Wed Sep 6 15:38:42 2006 @@ -23,7 +23,7 @@ /** * @author ceki */ -public class LoggerContext extends ContextBase implements ILoggerFactory { +public class LoggerContext extends ContextBase implements ILoggerFactory, LoggerContextView { public static final String ROOT_NAME = "root"; @@ -114,4 +114,11 @@ "No appenders present in context ["+ getName() +"] for logger [" + logger.getName() + "].", logger)); } } + + public LoggerContextSer getLoggerContextSer() { + LoggerContextSer loggerContextSer = new LoggerContextSer(); + loggerContextSer.name = this.getName(); + loggerContextSer.propertyMap = this.getPropertyMap(); + return loggerContextSer; + } } Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextSer.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextSer.java Wed Sep 6 15:38:42 2006 @@ -0,0 +1,40 @@ +/** + * Logback: the reliable, generic, fast and flexible logging framework. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic; + +import java.io.Serializable; +import java.util.Map; + +/** + * The object used to contain the LoggerContext informations once the + * serialization has taken place. + * + * @author Sébastien Pennec + */ +public class LoggerContextSer implements LoggerContextView, Serializable { + + /** + * + */ + private static final long serialVersionUID = 6615558506849441711L; + + + String name; + Map<String, String> propertyMap; + + public String getName() { + return name; + } + + public Map<String, String> getPropertyMap() { + return propertyMap; + } + +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextView.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContextView.java Wed Sep 6 15:38:42 2006 @@ -0,0 +1,9 @@ +package ch.qos.logback.classic; + +import java.util.Map; + +public interface LoggerContextView { + + public String getName(); + public Map<String, String> getPropertyMap(); +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerSer.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerSer.java Wed Sep 6 15:38:42 2006 @@ -0,0 +1,46 @@ +/** + * Logback: the reliable, generic, fast and flexible logging framework. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic; + +import java.io.Serializable; + +/** + * The object used to contain the LoggerContext informations once the + * serialization has taken place. + * + * @author Sébastien Pennec + */ +public class LoggerSer implements LoggerView, Serializable { + + /** + * + */ + private static final long serialVersionUID = 5323186084164784257L; + + Level level; + LoggerContextView loggerContext; + String name; + + public Level getLevel() { + return level; + } + + public LoggerContextView getLoggerContext() { + return loggerContext; + } + + public String getName() { + return name; + } + + public LoggerSer getLoggerSer() { + return this; + } +} Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerView.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerView.java Wed Sep 6 15:38:42 2006 @@ -0,0 +1,28 @@ +/** + * Logback: the reliable, generic, fast and flexible logging framework. + * + * Copyright (C) 1999-2006, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ + +package ch.qos.logback.classic; + +/** + * An interface that allows Logger objects and LoggerSer objects to be used the + * same way be client of the LoggingEvent object. + * + * @author Sébastien Pennec + */ +public interface LoggerView { + + public String getName(); + + public Level getLevel(); + + public LoggerContextView getLoggerContext(); + + public LoggerSer getLoggerSer(); +} Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Wed Sep 6 15:38:42 2006 @@ -16,11 +16,11 @@ import java.io.Serializable; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.slf4j.Marker; import org.slf4j.impl.MessageFormatter; import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerView; /** * The internal representation of logging events. When an affirmative decision @@ -80,9 +80,9 @@ private Object[] argumentArray; - private transient Logger logger; + private transient LoggerView logger; - private transient ThrowableInformation throwableInfo; + private transient ThrowableInformation throwableInfo; private transient CallerData[] callerDataArray; @@ -100,7 +100,7 @@ public LoggingEvent(String fqcn, Logger logger, Level level, String message, Throwable throwable, Object[] argArray) { this.fqnOfLoggerClass = fqcn; - this.logger = logger; + this.logger = (ch.qos.logback.classic.Logger)logger; this.level = level; this.message = message; @@ -179,11 +179,11 @@ this.getThreadName(); } - public Logger getLogger() { + public LoggerView getLogger() { return logger; } - public void setLogger(Logger logger) { + public void setLogger(LoggerView logger) { this.logger = logger; } @@ -266,15 +266,16 @@ private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); - out.writeObject(logger.getName()); + out.writeObject(logger.getLoggerSer()); out.writeInt(level.levelInt); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); - String loggerName = (String) in.readObject(); - logger = LoggerFactory.getLogger(loggerName); + //String loggerName = (String) in.readObject(); + //logger = LoggerFactory.getLogger(loggerName); + logger = (LoggerView)in.readObject(); int levelInt = in.readInt(); level = Level.toLevel(levelInt); } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerStatusPrinter.java Wed Sep 6 15:38:42 2006 @@ -12,7 +12,7 @@ public static void printStatusInDefaultContext() { Logger logger = (Logger)LoggerFactory.getLogger(LoggerStatusPrinter.class); - LoggerContext lc = logger.getLoggerContext(); + LoggerContext lc = (LoggerContext)logger.getLoggerContext(); StatusManager sm = lc.getStatusManager(); StatusPrinter.print(sm); } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java Wed Sep 6 15:38:42 2006 @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory; -import ch.qos.logback.BasicConfigurator; import ch.qos.logback.core.appender.ListAppender; import ch.qos.logback.core.util.StatusPrinter; @@ -60,7 +59,7 @@ public void testRootLogger() { Logger logger = (Logger)LoggerFactory.getLogger(LoggerContext.ROOT_NAME); - LoggerContext lc = logger.getLoggerContext(); + LoggerContext lc = (LoggerContext)logger.getLoggerContext(); assertNotNull("Returned logger is null", logger); assertEquals("Return logger isn't named root", logger.getName(), LoggerContext.ROOT_NAME); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/MockSocketServer.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/MockSocketServer.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/MockSocketServer.java Wed Sep 6 15:38:42 2006 @@ -16,6 +16,8 @@ import java.util.ArrayList; import java.util.List; +import ch.qos.logback.classic.spi.LoggingEvent; + /** * * @@ -23,20 +25,13 @@ */ public class MockSocketServer extends Thread { - static final String LOGGINGEVENT = "LoggingEvent"; - static final String LOGGINGEVENT2 = "LoggingEvent2"; - static final String MINIMALEXT = "MinimalExt"; - static final String MINIMALSER = "MinimalSer"; - static final int PORT = 4560; final int loopLen; - List<String> msgList = new ArrayList<String>(); + List<LoggingEvent> loggingEventList = new ArrayList<LoggingEvent>(); boolean finished = false; - String className = LOGGINGEVENT; - MockSocketServer(int loopLen) { super(); this.loopLen = loopLen; @@ -45,7 +40,8 @@ @Override public void run() { ObjectInputStream ois; - Object readObject; + //Object readObject; + LoggingEvent event; try { //System.out.println("Listening on port " + PORT); ServerSocket serverSocket = new ServerSocket(PORT); @@ -55,8 +51,10 @@ ois = new ObjectInputStream(new BufferedInputStream(socket .getInputStream())); for (int i = 0; i < loopLen; i++) { - readObject = ois.readObject(); - msgList.add(readObject.toString()); + event = (LoggingEvent)ois.readObject(); +// System.out.println("* LoggerName:" + event.getLogger().getName()); +// System.out.println("* Context Name: " + event.getLogger().getLoggerContext().getName()); + loggingEventList.add(event); } ois.close(); serverSocket.close(); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SerializationPerfsTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SerializationPerfsTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SerializationPerfsTest.java Wed Sep 6 15:38:42 2006 @@ -14,28 +14,25 @@ public class SerializationPerfsTest extends TestCase { ObjectOutputStream oos; - MockSocketServer mockServer; int loopNumber = 10000; int resetFrequency = 100; - int pauseFrequency = 500; + int pauseFrequency = 200; long pauseLengthInMillis = 20; - + /** + * <p> * Run the test with a MockSocketServer or with a NOPOutputStream - */ - boolean runWithMockServer = true; - /** + * </p> * <p> - * Run with external mock can be done using the - * ExternalMockSocketServer. It needs to be launched - * from a separate JVM. The ExternalMockSocketServer does not - * consume the events but passes through the available bytes - * that it is recieving. + * Run with external mock can be done using the ExternalMockSocketServer. It + * needs to be launched from a separate JVM. The ExternalMockSocketServer does + * not consume the events but passes through the available bytes that it is + * recieving. * </p> * <p> - * For example, with 4 test methods, - * you can launch the ExternalMockSocketServer this way: + * For example, with 4 test methods, you can launch the + * ExternalMockSocketServer this way: * </p> * <p> * <code>java ch.qos.logback.classic.net.ExternalMockSocketServer 4</code> @@ -55,13 +52,6 @@ * | LoggEvent Ext | 10000 | 9641 | | * | LoggEvent Ser | 10000 | 25729 | | * - * Internal MockServer: - * | | Runs | Avg time | Data sent | - * | MinimalObj Ext | 10000 | 62040 | | - * | MinimalObj Ser | 10000 | 76237 | | - * | LoggEvent Ext | 10000 | 122714 | | - * | LoggEvent Ser | 10000 | 121711 | | - * * External MockServer with 45 letters-long message: * | | Runs | Avg time | Data sent | * | MinimalObj Ext | 10000 | 70240 | 1171384 | @@ -90,13 +80,9 @@ public void setUp() throws Exception { super.setUp(); - if (runWithMockServer) { - if (!runWithExternalMockServer) { - mockServer = new MockSocketServer(loopNumber * 2); - mockServer.start(); - } + if (runWithExternalMockServer) { oos = new ObjectOutputStream(new Socket("localhost", - MockSocketServer.PORT).getOutputStream()); + ExternalMockSocketServer.PORT).getOutputStream()); } else { oos = new ObjectOutputStream(new NOPOutputStream()); } @@ -106,20 +92,19 @@ super.tearDown(); oos.close(); oos = null; - mockServer = null; } public void runPerfTest(Builder builder, String label) throws Exception { - //long time1 = System.nanoTime(); + // long time1 = System.nanoTime(); + + // Object builtObject = builder.build(1); - Object builtObject = builder.build(1); - // first run for just in time compiler int resetCounter = 0; int pauseCounter = 0; for (int i = 0; i < loopNumber; i++) { try { - oos.writeObject(builtObject); + oos.writeObject(builder.build(i)); oos.flush(); if (++resetCounter >= resetFrequency) { oos.reset(); @@ -129,6 +114,7 @@ Thread.sleep(pauseLengthInMillis); pauseCounter = 0; } + } catch (IOException ex) { fail(ex.getMessage()); } @@ -136,15 +122,15 @@ // second run Long t1; - Long t2 ; + Long t2; Long total = 0L; resetCounter = 0; pauseCounter = 0; - //System.out.println("Beginning mesured run"); + // System.out.println("Beginning mesured run"); for (int i = 0; i < loopNumber; i++) { try { t1 = System.nanoTime(); - oos.writeObject(builtObject); + oos.writeObject(builder.build(i)); oos.flush(); t2 = System.nanoTime(); total += (t2 - t1); @@ -163,13 +149,9 @@ System.out.println(label + " : average time = " + total / loopNumber + " after " + loopNumber + " writes."); - if (runWithMockServer && !runWithExternalMockServer) { - mockServer.join(1000); - assertTrue(mockServer.finished); - } - - //long time2 = System.nanoTime(); - //System.out.println("********* -> Time needed to run the test method: " + Long.toString(time2-time1)); + // long time2 = System.nanoTime(); + // System.out.println("********* -> Time needed to run the test method: " + + // Long.toString(time2-time1)); } public void testWithMinimalExternalization() throws Exception { Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java Wed Sep 6 15:38:42 2006 @@ -1,8 +1,11 @@ package ch.qos.logback.classic.net; +import java.util.Map; + import junit.framework.TestCase; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; public class SocketAppenderTest extends TestCase { @@ -22,6 +25,8 @@ // client configuration LoggerContext lc = new LoggerContext(); + lc.setName("test"); + lc.getPropertyMap().put("testKey", "testValue"); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); SocketAppender socketAppender = new SocketAppender(); socketAppender.setContext(lc); @@ -30,7 +35,7 @@ socketAppender.setRemoteHost("localhost"); root.addAppender(socketAppender); socketAppender.start(); - + Logger logger = lc.getLogger(LoggerContext.ROOT_NAME); logger.debug("test"); @@ -38,7 +43,11 @@ // finish much sooner than that. mockServer.join(2000); assertTrue(mockServer.finished); - assertTrue(mockServer.msgList.get(0).startsWith("ch.qos.logback.classic.spi.LoggingEvent@")); - + assertEquals(1, mockServer.loggingEventList.size()); + LoggingEvent remoteEvent = mockServer.loggingEventList.get(0); + assertEquals("test", remoteEvent.getLogger().getLoggerContext().getName()); + assertEquals("root", remoteEvent.getLogger().getName()); + Map<String, String> props = remoteEvent.getLogger().getLoggerContext().getPropertyMap(); + assertEquals("testValue", props.get("testKey")); } } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java Wed Sep 6 15:38:42 2006 @@ -50,7 +50,7 @@ static void init(String host, String portStr) { Logger root = (Logger) LoggerFactory.getLogger(LoggerContext.ROOT_NAME); - BasicConfigurator.configure(root.getLoggerContext()); + BasicConfigurator.configure((LoggerContext)root.getLoggerContext()); try { int port = Integer.parseInt(portStr); logger.info("Creating socket appender (" + host + "," + port + ").");