Index: logback-access/src/test/java/ch/qos/logback/access/jetty/JettyBasicTest.java =================================================================== --- logback-access/src/test/java/ch/qos/logback/access/jetty/JettyBasicTest.java (revision 1828) +++ logback-access/src/test/java/ch/qos/logback/access/jetty/JettyBasicTest.java (working copy) @@ -59,7 +59,7 @@ String result = Util.readToString(connection.getInputStream()); assertEquals("hello world", result); - //Thread.sleep(100); + Thread.sleep(100); ListAppender appender = (ListAppender) requestLogImpl.getAppender("list"); assertTrue(appender.list.size()>0); AccessEvent event = (AccessEvent) appender.list.get(0); Index: logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java =================================================================== --- logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java (revision 1828) +++ logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java (working copy) @@ -76,14 +76,12 @@ private void buildContext() { - ListAppender appender = new ListAppender(); + ListAppender appender = new ListAppender("list"); appender.setContext(requestLogImpl); - appender.setName("list"); appender.start(); - ConsoleAppender console = new ConsoleAppender(); + ConsoleAppender console = new ConsoleAppender("console"); console.setContext(requestLogImpl); - console.setName("console"); PatternLayout layout = new PatternLayout(); layout.setContext(requestLogImpl); layout.setPattern("%date %server %clientHost"); Index: logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderTest.java =================================================================== --- logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderTest.java (revision 1828) +++ logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderTest.java (working copy) @@ -26,8 +26,7 @@ super.setUp(); context = new AccessContext(); context.setName("default"); - appender = new DBAppender(); - appender.setName("DB"); + appender = new DBAppender("DB"); appender.setContext(context); connectionSource = new DriverManagerConnectionSource(); connectionSource.setContext(context); Index: logback-access/src/test/java/ch/qos/logback/access/net/SocketAppenderTest.java =================================================================== --- logback-access/src/test/java/ch/qos/logback/access/net/SocketAppenderTest.java (revision 1828) +++ logback-access/src/test/java/ch/qos/logback/access/net/SocketAppenderTest.java (working copy) @@ -24,7 +24,7 @@ public void testStartFailNoRemoteHost() { context = new AccessContext(); - SocketAppender appender = new SocketAppender(); + SocketAppender appender = new SocketAppender("test"); appender.setContext(context); appender.setPort(123); appender.start(); @@ -59,9 +59,8 @@ private void configureClient() { context = new AccessContext(); context.setName("test"); - SocketAppender socketAppender = new SocketAppender(); + SocketAppender socketAppender = new SocketAppender("socket"); socketAppender.setContext(context); - socketAppender.setName("socket"); socketAppender.setPort(MockSocketServer.PORT); socketAppender.setRemoteHost("localhost"); context.addAppender(socketAppender); Index: logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java (working copy) @@ -207,6 +207,10 @@ return false; } + public long getAppenderCount() { + return aai.getAppenderCount(); + } + public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } Index: logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java (working copy) @@ -63,7 +63,8 @@ GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod; } - public DBAppender() { + public DBAppender(String name) { + super(name); } @Override Index: logback-access/src/main/java/ch/qos/logback/access/net/SMTPAppender.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/net/SMTPAppender.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/net/SMTPAppender.java (working copy) @@ -40,14 +40,16 @@ * {@link EventEvaluator} that will trigger on events with level * ERROR or higher. */ - public SMTPAppender() { + public SMTPAppender(String name) { + super(name); } /** * Use evaluator passed as parameter as the {@link * EventEvaluator} for this SMTPAppender. */ - public SMTPAppender(EventEvaluator evaluator) { + public SMTPAppender(String name, EventEvaluator evaluator) { + super(name); this.eventEvaluator = evaluator; } Index: logback-access/src/main/java/ch/qos/logback/access/net/SocketAppender.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/net/SocketAppender.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/net/SocketAppender.java (working copy) @@ -30,13 +30,15 @@ public class SocketAppender extends SocketAppenderBase { - public SocketAppender() { + public SocketAppender(String name) { + super(name); } /** * Connects to remote server at address and port. */ - public SocketAppender(InetAddress address, int port) { + public SocketAppender(String name, InetAddress address, int port) { + super(name); this.address = address; this.remoteHost = address.getHostName(); this.port = port; @@ -45,7 +47,8 @@ /** * Connects to remote server at host and port. */ - public SocketAppender(String host, int port) { + public SocketAppender(String name, String host, int port) { + super(name); this.port = port; this.address = getAddressByName(host); this.remoteHost = host; Index: logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java (working copy) @@ -144,6 +144,10 @@ started = false; } + public long getAppenderCount() { + return aai.getAppenderCount(); + } + public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } Index: logback-access/src/main/java/ch/qos/logback/access/spi/AccessContext.java =================================================================== --- logback-access/src/main/java/ch/qos/logback/access/spi/AccessContext.java (revision 1828) +++ logback-access/src/main/java/ch/qos/logback/access/spi/AccessContext.java (working copy) @@ -22,6 +22,10 @@ AppenderAttachableImpl aai = new AppenderAttachableImpl(); FilterAttachableImpl fai = new FilterAttachableImpl(); + + public long getAppenderCount() { + return aai.getAppenderCount(); + } public void callAppenders(AccessEvent event) { aai.appendLoopOnAppenders(event); Index: logback-classic/src/test/java/org/dummy/DummyLBAppender.java =================================================================== --- logback-classic/src/test/java/org/dummy/DummyLBAppender.java (revision 1828) +++ logback-classic/src/test/java/org/dummy/DummyLBAppender.java (working copy) @@ -23,11 +23,12 @@ PatternLayout layout; - DummyLBAppender() { - this(null); + public DummyLBAppender(String name) { + this(name, null); } - DummyLBAppender(PatternLayout layout) { + DummyLBAppender(String name, PatternLayout layout) { + super(name); this.layout = layout; } Index: logback-classic/src/test/java/org/dummy/Log4jInvocation.java =================================================================== --- logback-classic/src/test/java/org/dummy/Log4jInvocation.java (revision 1828) +++ logback-classic/src/test/java/org/dummy/Log4jInvocation.java (working copy) @@ -25,7 +25,7 @@ lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.shutdownAndReset(); - listAppender = new DummyLBAppender(); + listAppender = new DummyLBAppender("Dummy"); listAppender.setContext(lc); listAppender.start(); rootLogger = lc.getLogger("root"); Index: logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java (working copy) @@ -28,8 +28,7 @@ lc = new LoggerContext(); lc.setName("default"); logger = lc.getLogger("root"); - appender = new DBAppender(); - appender.setName("DB"); + appender = new DBAppender("DB"); appender.setContext(lc); connectionSource = new DriverManagerConnectionSource(); connectionSource.setContext(lc); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java (working copy) @@ -47,7 +47,7 @@ LoggerContext lc = new LoggerContext(); lc.setName("test"); - SyslogAppender sa = new SyslogAppender(); + SyslogAppender sa = new SyslogAppender("test"); sa.setContext(lc); sa.setSyslogHost("localhost"); sa.setFacility("MAIL"); @@ -91,7 +91,7 @@ LoggerContext lc = new LoggerContext(); lc.setName("test"); - SyslogAppender sa = new SyslogAppender(); + SyslogAppender sa = new SyslogAppender("test"); sa.setContext(lc); sa.setSyslogHost("localhost"); sa.setFacility("MAIL"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTest.java (working copy) @@ -23,9 +23,8 @@ @Override protected void setUp() throws Exception { context = new ContextBase(); - appender = new JMSTopicAppender(); + appender = new JMSTopicAppender("jmsTopic"); appender.setContext(context); - appender.setName("jmsTopic"); appender.tcfBindingName = "topicCnxFactory"; appender.topicBindingName = "testTopic"; appender.setProviderURL("url"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java (working copy) @@ -36,14 +36,14 @@ int port = 4561; LoggerContext lc = new LoggerContext(); LoggerContext serverLC = new LoggerContext(); - ListAppender la = new ListAppender(); - SocketAppender socketAppender = new SocketAppender(); + ListAppender la = new ListAppender(LIST_APPENDER_NAME); + SocketAppender socketAppender = new SocketAppender("socket"); private SimpleSocketServer simpleSocketServer; @Test public void startFailNoRemoteHost() { - SocketAppender appender = new SocketAppender(); + SocketAppender appender = new SocketAppender("SOCKET"); appender.setContext(lc); appender.setPort(123); appender.start(); @@ -209,7 +209,6 @@ private void fireServer() throws InterruptedException { Logger root = serverLC.getLogger("root"); - la.setName(LIST_APPENDER_NAME); la.setContext(serverLC); la.start(); root.addAppender(la); @@ -229,7 +228,6 @@ lc.putProperty("testKey", "testValue"); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); socketAppender.setContext(lc); - socketAppender.setName("socket"); socketAppender.setPort(port); socketAppender.setRemoteHost("localhost"); root.addAppender(socketAppender); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java (working copy) @@ -13,9 +13,8 @@ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.shutdownAndReset(); - JMSTopicAppender appender = new JMSTopicAppender(); + JMSTopicAppender appender = new JMSTopicAppender("jmsTopic"); appender.setContext(lc); - appender.setName("jmsTopic"); appender.setInitialContextFactoryName("org.apache.activemq.jndi.ActiveMQInitialContextFactory"); //appender.setPassword(""); appender.setProviderURL("tcp://localhost:61616"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java (working copy) @@ -24,9 +24,8 @@ @Before public void setUp() throws Exception { LoggerContext lc = new LoggerContext(); - appender = new SMTPAppender(); + appender = new SMTPAppender("smtp"); appender.setContext(lc); - appender.setName("smtp"); appender.setFrom("user@host.dom"); appender.setLayout(buildLayout(lc)); appender.setSMTPHost("mail2.qos.ch"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTest.java (working copy) @@ -20,9 +20,8 @@ @Override protected void setUp() throws Exception { context = new ContextBase(); - appender = new JMSQueueAppender(); + appender = new JMSQueueAppender("jmsQueue"); appender.setContext(context); - appender.setName("jmsQueue"); appender.qcfBindingName = "queueCnxFactory"; appender.queueBindingName = "testQueue"; appender.setProviderURL("url"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java (working copy) @@ -13,9 +13,8 @@ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.shutdownAndReset(); - JMSQueueAppender appender = new JMSQueueAppender(); + JMSQueueAppender appender = new JMSQueueAppender("jmsQueue"); appender.setContext(lc); - appender.setName("jmsQueue"); appender.setInitialContextFactoryName("org.apache.activemq.jndi.ActiveMQInitialContextFactory"); //appender.setPassword(""); appender.setProviderURL("tcp://localhost:61616"); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java (working copy) @@ -48,9 +48,8 @@ } void buildSMTPAppender() throws Exception { - smtpAppender = new SMTPAppender(); + smtpAppender = new SMTPAppender("smtp"); smtpAppender.setContext(lc); - smtpAppender.setName("smtp"); smtpAppender.setFrom("user@host.dom"); smtpAppender.setSMTPHost("localhost"); smtpAppender.setSMTPPort(diff); Index: logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java (working copy) @@ -54,8 +54,7 @@ try { int port = Integer.parseInt(portStr); logger.info("Creating socket appender (" + host + "," + port + ")."); - s = new SocketAppender(host, port); - s.setName("S"); + s = new SocketAppender("S", host, port); root.addAppender(s); } catch (java.lang.NumberFormatException e) { e.printStackTrace(); Index: logback-classic/src/test/java/ch/qos/logback/classic/LoggerSerializationTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/LoggerSerializationTest.java (revision 0) +++ logback-classic/src/test/java/ch/qos/logback/classic/LoggerSerializationTest.java (revision 0) @@ -0,0 +1,64 @@ +package ch.qos.logback.classic; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import ch.qos.logback.core.Appender; +import junit.framework.TestCase; +import org.dummy.DummyLBAppender; + +public class LoggerSerializationTest extends TestCase { + + LoggerContext lc; + Logger logger; + + ByteArrayOutputStream bos; + ObjectOutputStream oos; + ObjectInputStream inputStream; + + public void setUp() throws Exception { + lc = new LoggerContext(); + lc.setName("testContext"); + logger = lc.getLogger(LoggerContext.ROOT_NAME); + // create the byte output stream + bos = new ByteArrayOutputStream(); + oos = new ObjectOutputStream(bos); + } + + public void tearDown() throws Exception { + lc = null; + logger = null; + oos.close(); + } + + public void testSerialization() throws Exception { + Appender ap = new DummyLBAppender("test"); + logger.addAppender(ap); + Logger logger2 = writeAndRead(logger); + checkForEquality(logger, logger2); + } + + private void checkForEquality(Logger original, + Logger afterSerialization) { + assertEquals(original.getLevel(), afterSerialization.getLevel()); + assertEquals(original.getName(), afterSerialization.getName()); + assertEquals(original.getEffectiveLevel(), afterSerialization.getEffectiveLevel()); + assertTrue(afterSerialization.getAppenderCount() == 0); + + System.out.println(); + + } + + private Logger writeAndRead(Logger logger) throws IOException, + ClassNotFoundException { + oos.writeObject(logger); + ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + inputStream = new ObjectInputStream(bis); + + return (Logger) inputStream.readObject(); + } + +} \ No newline at end of file Index: logback-classic/src/test/java/ch/qos/logback/classic/MessageFormattingTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/MessageFormattingTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/MessageFormattingTest.java (working copy) @@ -21,7 +21,7 @@ public void setUp() { lc = new LoggerContext(); Logger logger = lc.getLogger(LoggerContext.ROOT_NAME); - listAppender = new ListAppender(); + listAppender = new ListAppender("test"); listAppender.setContext(lc); listAppender.start(); logger.addAppender(listAppender); Index: logback-classic/src/test/java/ch/qos/logback/classic/StringListAppender.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/StringListAppender.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/StringListAppender.java (working copy) @@ -9,6 +9,10 @@ public class StringListAppender extends AppenderBase { + public StringListAppender(String name) { + super(name); + } + Layout layout; public List strList = new ArrayList(); Index: logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java (working copy) @@ -21,7 +21,7 @@ public void testBasic() { LoggerContext lc = new LoggerContext(); - ListAppender listAppender = new ListAppender(); + ListAppender listAppender = new ListAppender("test"); listAppender.start(); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); @@ -33,7 +33,7 @@ public void testNoStart() { LoggerContext lc = new LoggerContext(); - ListAppender listAppender = new ListAppender(); + ListAppender listAppender = new ListAppender("test"); // listAppender.start(); listAppender.setContext(lc); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); @@ -45,7 +45,7 @@ public void testAdditive() { LoggerContext lc = new LoggerContext(); - ListAppender listAppender = new ListAppender(); + ListAppender listAppender = new ListAppender("test"); listAppender.start(); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); @@ -69,7 +69,7 @@ public void testBasicFiltering() throws Exception { LoggerContext lc = new LoggerContext(); - ListAppender listAppender = new ListAppender(); + ListAppender listAppender = new ListAppender("test"); listAppender.start(); Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); Index: logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (working copy) @@ -37,7 +37,7 @@ lc = new LoggerContext(); lc.setName("default"); - ListAppender appender = new ListAppender(); + ListAppender appender = new ListAppender("test"); appender.setContext(lc); layout = new HTMLLayout(); layout.setThrowableRenderer(new DefaultThrowableRenderer()); Index: logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java =================================================================== --- logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java (revision 1828) +++ logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java (working copy) @@ -59,7 +59,7 @@ double basicDurationInNanos(long len) { LoggerContext lc = new LoggerContext(); - NOPAppender mopAppender = new NOPAppender(); + NOPAppender mopAppender = new NOPAppender("Noop"); mopAppender.start(); Logger logger = lc.getLogger(this.getClass()); logger.setLevel(Level.OFF); @@ -76,7 +76,7 @@ double loopParameterized(long len) { LoggerContext lc = new LoggerContext(); - NOPAppender mopAppender = new NOPAppender(); + NOPAppender mopAppender = new NOPAppender("Noop"); mopAppender.start(); Logger logger = lc.getLogger(this.getClass()); logger.setLevel(Level.OFF); @@ -93,7 +93,7 @@ double loopNopFilter(long len) { LoggerContext lc = new LoggerContext(); - NOPAppender mopAppender = new NOPAppender(); + NOPAppender mopAppender = new NOPAppender("Noop"); NOPTurboFilter nopFilter = new NOPTurboFilter(); nopFilter.setName("nop"); mopAppender.start(); Index: logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java (working copy) @@ -37,9 +37,8 @@ if(sm != null) { sm.add(new InfoStatus("Setting up default configuration.", lc)); } - ConsoleAppender ca = new ConsoleAppender(); + ConsoleAppender ca = new ConsoleAppender("console"); ca.setContext(lc); - ca.setName("console"); PatternLayout pl = new PatternLayout(); pl.setContext(lc); pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); Index: logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (working copy) @@ -69,7 +69,8 @@ GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod; } - public DBAppender() { + public DBAppender(String name) { + super(name); } @Override Index: logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java (working copy) @@ -36,6 +36,10 @@ static final public String DEFAULT_SUFFIX_PATTERN = "[%thread] %logger %msg"; + public SyslogAppender(String name) { + super(name); + } + public Layout buildLayout(String facilityStr) { prefixPattern = "%syslogStart{" + facilityStr + "}%nopex"; Index: logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java (working copy) @@ -43,8 +43,8 @@ * {@link EventEvaluator} that will trigger on events with level * ERROR or higher. */ - public SMTPAppender() { - + public SMTPAppender(String name) { + super(name); } public void start() { @@ -63,7 +63,8 @@ * Use the parameter as the {@link * EventEvaluator} for this SMTPAppender. */ - public SMTPAppender(EventEvaluator eventEvaluator) { + public SMTPAppender(EventEvaluator eventEvaluator, String name) { + super(name); this.eventEvaluator = eventEvaluator; } Index: logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java (working copy) @@ -45,7 +45,8 @@ int successiveFailureCount = 0; - public JMSTopicAppender() { + public JMSTopicAppender(String name) { + super(name); } /** @@ -116,7 +117,7 @@ jndi.close(); } catch (Exception e) { - addError("Error while activating options for appender named [" + name + addError("Error while activating options for appender named [" + getName() + "].", e); } @@ -146,7 +147,7 @@ topicConnection.close(); } } catch (Exception e) { - addError("Error while closing JMSAppender [" + name + "].", e); + addError("Error while closing JMSAppender [" + getName() + "].", e); } // Help garbage collection @@ -176,7 +177,7 @@ if (successiveFailureCount > SUCCESSIVE_FAILURE_LIMIT) { stop(); } - addError("Could not publish message in JMSTopicAppender [" + name + "].", e); + addError("Could not publish message in JMSTopicAppender [" + getName() + "].", e); } } Index: logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java (working copy) @@ -31,13 +31,15 @@ boolean includeCallerData = false; - public SocketAppender() { + public SocketAppender(String name) { + super(name); } /** * Connects to remote server at address and port. */ - public SocketAppender(InetAddress address, int port) { + public SocketAppender(String name, InetAddress address, int port) { + super(name); this.address = address; this.remoteHost = address.getHostName(); this.port = port; @@ -46,7 +48,8 @@ /** * Connects to remote server at host and port. */ - public SocketAppender(String host, int port) { + public SocketAppender(String name, String host, int port) { + super(name); this.port = port; this.address = getAddressByName(host); this.remoteHost = host; Index: logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java (working copy) @@ -45,7 +45,8 @@ int successiveFailureCount = 0; - public JMSQueueAppender() { + public JMSQueueAppender(String name) { + super(name); } /** @@ -116,7 +117,7 @@ jndi.close(); } catch (Exception e) { - addError("Error while activating options for appender named [" + name + addError("Error while activating options for appender named [" + getName() + "].", e); } @@ -146,7 +147,7 @@ queueConnection.close(); } } catch (Exception e) { - addError("Error while closing JMSAppender [" + name + "].", e); + addError("Error while closing JMSAppender [" + getName() + "].", e); } // Help garbage collection @@ -174,7 +175,7 @@ if (successiveFailureCount > SUCCESSIVE_FAILURE_LIMIT) { stop(); } - addError("Could not send message in JMSQueueAppender [" + name + "].", e); + addError("Could not send message in JMSQueueAppender [" + getName() + "].", e); } } Index: logback-classic/src/main/java/ch/qos/logback/classic/Logger.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/Logger.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/Logger.java (working copy) @@ -11,6 +11,8 @@ package ch.qos.logback.classic; import java.io.Serializable; +import java.io.ObjectInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -66,7 +68,9 @@ */ private List childrenList; - private transient AppenderAttachableImpl aai; + private transient AppenderAttachableImpl aai = + new AppenderAttachableImpl(); + /** * Additivity is set to true by default, that is children inherit the * appenders of their ancestors by default. If this variable is set to @@ -196,57 +200,45 @@ // propagate the parent levelInt change to this logger's children // propagate the parent levelInt change to this logger's children if (childrenList != null) { - int len = childrenList.size(); - for (int i = 0; i < len; i++) { - Logger child = (Logger) childrenList.get(i); + for (Logger child : childrenList) { child.handleParentLevelChange(newParentLevel); } } } } + public long getAppenderCount() { + return aai.getAppenderCount(); + } + /** * Remove all previously added appenders from this logger instance.

This * is useful when re-reading configuration information. */ - public synchronized void detachAndStopAllAppenders() { - if (aai != null) { - aai.detachAndStopAllAppenders(); - } + public void detachAndStopAllAppenders() { + aai.detachAndStopAllAppenders(); } - public synchronized Appender detachAppender(String name) { - if (aai == null) { - return null; - } + public Appender detachAppender(String name) { return aai.detachAppender(name); } - public synchronized void addAppender(Appender newAppender) { - if (aai == null) { - aai = new AppenderAttachableImpl(); - } + public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } public boolean isAttached(Appender appender) { - if (aai == null) { - return false; - } return aai.isAttached(appender); } - public synchronized Iterator iteratorForAppenders() { - if (aai == null) { + public Iterator iteratorForAppenders() { + if (aai.getAppenderCount() == 0) { return Collections.EMPTY_LIST.iterator(); } return aai.iteratorForAppenders(); } public Appender getAppender(String name) { - if (aai == null) { - return null; - } return aai.getAppender(name); } @@ -261,12 +253,9 @@ // System.out.println("callAppenders"); for (Logger l = this; l != null; l = l.parent) { // System.out.println("l="+l.getName()); - // Protected against simultaneous call to addAppender, removeAppender,... - synchronized (l) { - writes += l.appendLoopOnAppenders(event); - if (!l.additive) { - break; - } + writes += l.aai.appendLoopOnAppenders(event); + if (!l.additive) { + break; } } @@ -276,21 +265,10 @@ } } - private int appendLoopOnAppenders(LoggingEvent event) { - int size = 0; - if (aai != null) { - size = aai.appendLoopOnAppenders(event); - } - return size; - } - /** * Remove the appender passed as parameter form the list of appenders. */ - public synchronized boolean detachAppender(Appender appender) { - if (aai == null) { - return false; - } + public boolean detachAppender(Appender appender) { return aai.detachAppender(appender); } @@ -817,4 +795,11 @@ } filterAndLog(fqcn, marker, level, message, null, t); } + + private void readObject(ObjectInputStream ois) + throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + aai = new AppenderAttachableImpl(); + } + } Index: logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConsolePluginAction.java =================================================================== --- logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConsolePluginAction.java (revision 1828) +++ logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConsolePluginAction.java (working copy) @@ -32,7 +32,7 @@ } LoggerContext lc = (LoggerContext)ec.getContext(); - SocketAppender appender = new SocketAppender(); + SocketAppender appender = new SocketAppender("ConsolePlugin"); appender.setContext(lc); appender.setIncludeCallerData(true); appender.setRemoteHost("localhost"); Index: logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java (working copy) @@ -23,6 +23,7 @@ suite.addTest(ch.qos.logback.core.joran.PackageTest.suite()); suite.addTest(ch.qos.logback.core.appender.PackageTest.suite()); suite.addTest(ch.qos.logback.core.rolling.PackageTest.suite()); + suite.addTest(ch.qos.logback.core.spi.PackageTest.suite()); return suite; } } Index: logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java (working copy) @@ -54,7 +54,7 @@ public void testRename() throws Exception { - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setLayout(layout); rfa.setContext(context); rfa.setFile(Constants.OUTPUT_DIR_PREFIX + "test.log"); Index: logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java (working copy) @@ -72,7 +72,7 @@ // This makes the regression test system independent. Context context = new ContextBase(); Layout layout = new DummyLayout(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setLayout(layout); rfa.setContext(new ContextBase()); @@ -104,8 +104,7 @@ Context context = new ContextBase(); DummyLayout layout = new DummyLayout("0123456789"); - RollingFileAppender rfa = new RollingFileAppender(); - rfa.setName("ROLLING"); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setLayout(layout); rfa.setContext(context); rfa.setFile(Constants.OUTPUT_DIR_PREFIX @@ -179,7 +178,7 @@ public void test3() throws Exception { Context context = new ContextBase(); DummyLayout layout = new DummyLayout("0123456789"); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setLayout(layout); rfa.setContext(context); rfa.setFile(Constants.OUTPUT_DIR_PREFIX + "sbr-test3.log"); Index: logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithCleanTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithCleanTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithCleanTest.java (working copy) @@ -68,7 +68,7 @@ throws Exception { long currentTime = System.currentTimeMillis(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setContext(context); rfa.setLayout(layout); // rfa.setFile(Constants.OUTPUT_DIR_PREFIX + "clean.txt"); Index: logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java (working copy) @@ -87,7 +87,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setContext(context); rfa.setLayout(layout); @@ -138,7 +138,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa1 = new RollingFileAppender(); + RollingFileAppender rfa1 = new RollingFileAppender("ROLLING1"); rfa1.setContext(context); rfa1.setLayout(layout); @@ -173,7 +173,7 @@ rfa1.stop(); - RollingFileAppender rfa2 = new RollingFileAppender(); + RollingFileAppender rfa2 = new RollingFileAppender("ROLLING2"); rfa2.setContext(context); rfa2.setLayout(layout); @@ -207,7 +207,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setContext(context); rfa.setLayout(layout); @@ -261,7 +261,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa1 = new RollingFileAppender(); + RollingFileAppender rfa1 = new RollingFileAppender("ROLLING1"); rfa1.setContext(context); rfa1.setLayout(layout); rfa1.setFile(Constants.OUTPUT_DIR_PREFIX + "test4.log"); @@ -298,7 +298,7 @@ rfa1.stop(); - RollingFileAppender rfa2 = new RollingFileAppender(); + RollingFileAppender rfa2 = new RollingFileAppender("ROLLING2"); rfa2.setContext(context); rfa2.setLayout(layout); rfa2.setFile(Constants.OUTPUT_DIR_PREFIX + "test4.log"); @@ -333,7 +333,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setContext(context); rfa.setLayout(layout); rfa.setFile(Constants.OUTPUT_DIR_PREFIX + "test5.log"); @@ -383,7 +383,7 @@ cal.set(Calendar.MILLISECOND, 0); long currentTime = cal.getTimeInMillis(); - RollingFileAppender rfa = new RollingFileAppender(); + RollingFileAppender rfa = new RollingFileAppender("ROLLING"); rfa.setContext(context); rfa.setLayout(layout); rfa.setFile(Constants.OUTPUT_DIR_PREFIX+ "test6.log"); Index: logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java (revision 0) +++ logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java (revision 0) @@ -0,0 +1,176 @@ +package ch.qos.logback.core.spi; + +import junit.framework.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; +import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.AppenderBase; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.appender.NOPAppender; +import ch.qos.logback.core.layout.NopLayout; + +import java.util.Iterator; + +/** + * This test case verifies all the methods of AppenderAttableImpl work properly. + * + * @author Ceki + */ +public class AppenderAttachableImplTest extends TestCase { + /** + * To run test suite from command line. + */ + public static void main(String[] args) { + junit.textui.TestRunner.run(suite()); + } + + /** + * Set up a test suite. + */ + public static Test suite() { + return new TestSuite(AppenderAttachableImplTest.class); + } + + public AppenderAttachableImplTest(String testName) { + super(testName); + } + + private AppenderAttachableImpl at; + + protected void setUp() throws Exception { + super.setUp(); + at = new AppenderAttachableImpl(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + at = null; + } + + public void testAddAppender() throws Exception { + TestEvent event = new TestEvent(); + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + ta = new TestAppender("test"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + int size = at.appendLoopOnAppenders(event); + assertTrue("Incorrect number of appenders", size == 2); + } + + public void testIteratorForAppenders() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + Iterator> iter = at.iteratorForAppenders(); + int size = 0; + while (iter.hasNext()) { + ++size; + TestAppender app = iter.next(); + assertTrue("Bad Appender", app == ta || app == tab); + } + assertTrue("Incorrect number of appenders", size == 2); + } + + public void getGetAppender() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + Appender a = at.getAppender("test"); + assertNotNull("Could not find appender", a); + assertTrue("Wrong appender", a == tab); + a = at.getAppender("test1"); + assertNotNull("Could not find appender", a); + assertTrue("Wrong appender", a == ta); + a = at.getAppender("NotThere"); + assertNull("Appender was returned", a); + } + + public void testIsAttached() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + assertTrue("Appender is not attached", at.isAttached(ta)); + assertTrue("Appender is not attached", at.isAttached(tab)); + } + + public void testDetachAndStopAllAppenders() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + assertTrue("Appender was not started", tab.isStarted()); + at.detachAndStopAllAppenders(); + assertNull("Appender was not removed", at.getAppender("test")); + assertFalse("Appender was not stopped", tab.isStarted()); + } + + public void testDetachAppender() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + assertTrue("Appender not detached", at.detachAppender(tab)); + assertNull("Appender was not removed", at.getAppender("test")); + assertFalse("Appender detach error", at.detachAppender(tab)); + } + + public void testDetachAppenderByName() throws Exception { + TestAppender ta = new TestAppender("test1"); + ta.setLayout(new NopLayout()); + ta.start(); + at.addAppender(ta); + TestAppender tab = new TestAppender("test"); + tab.setLayout(new NopLayout()); + tab.start(); + at.addAppender(tab); + Appender a = at.detachAppender("test"); + assertNotNull("Appender not detached", a); + a = at.detachAppender("test1"); + assertNotNull("Appender not detached", a); + a = at.detachAppender("test1"); + assertNull("Appender detach error", a); + } + + private static class TestEvent { + + } + + + private static class TestAppender extends AppenderBase { + + public TestAppender(String name) { + super(name); + } + protected void append(TestEvent event) { + + } + + } +} \ No newline at end of file Index: logback-core/src/test/java/ch/qos/logback/core/spi/PackageTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/spi/PackageTest.java (revision 0) +++ logback-core/src/test/java/ch/qos/logback/core/spi/PackageTest.java (revision 0) @@ -0,0 +1,15 @@ +package ch.qos.logback.core.spi; + +import junit.framework.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; + + +public class PackageTest extends TestCase { + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTestSuite(AppenderAttachableImplTest.class); + return suite; + } +} Index: logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java (working copy) @@ -53,19 +53,19 @@ } @Override - protected AppenderBase getAppender() { - return new ConsoleAppender(); + protected AppenderBase getAppender(String name) { + return new ConsoleAppender(name); } - protected AppenderBase getConfiguredAppender() { - ConsoleAppender ca = new ConsoleAppender(); + protected AppenderBase getConfiguredAppender(String name) { + ConsoleAppender ca = new ConsoleAppender(name); ca.setLayout(new NopLayout()); ca.start(); return ca; } public void testBasic() { - ConsoleAppender ca = (ConsoleAppender) getAppender(); + ConsoleAppender ca = (ConsoleAppender) getAppender("BASIC"); ca.setLayout(new DummyLayout()); ca.start(); ca.doAppend(new Object()); @@ -73,7 +73,7 @@ } public void testOpen() { - ConsoleAppender ca = (ConsoleAppender) getAppender(); + ConsoleAppender ca = (ConsoleAppender) getAppender("OPEN"); DummyLayout dummyLayout = new DummyLayout(); dummyLayout.setFileHeader("open"); ca.setLayout(dummyLayout); @@ -83,7 +83,7 @@ assertEquals("open"+Layout.LINE_SEP+DummyLayout.DUMMY, tee.toString()); } public void testClose() { - ConsoleAppender ca = (ConsoleAppender) getAppender(); + ConsoleAppender ca = (ConsoleAppender) getAppender("CLOSE"); DummyLayout dummyLayout = new DummyLayout(); dummyLayout.setFileFooter("closed"); ca.setLayout(dummyLayout); @@ -97,7 +97,7 @@ public void testUTF16BE() throws UnsupportedEncodingException { - ConsoleAppender ca = (ConsoleAppender) getAppender(); + ConsoleAppender ca = (ConsoleAppender) getAppender("UTF16BE"); ca.setLayout(new DummyLayout()); String encodingName = "UTF-16BE"; ca.setEncoding(encodingName); Index: logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java (working copy) @@ -25,17 +25,17 @@ super(arg); } - abstract protected AppenderBase getAppender(); - abstract protected AppenderBase getConfiguredAppender(); + abstract protected AppenderBase getAppender(String name); + abstract protected AppenderBase getConfiguredAppender(String name); public void testNewAppender() { // new appenders should be inactive - AppenderBase appender = getAppender(); + AppenderBase appender = getAppender("test"); assertFalse( appender.isStarted()); } public void testConfiguredAppender() { - AppenderBase appender = getConfiguredAppender(); + AppenderBase appender = getConfiguredAppender("test"); appender.start(); assertTrue(appender.isStarted()); @@ -45,10 +45,9 @@ } public void testNoStart() { - AppenderBase appender = getAppender(); + AppenderBase appender = getAppender("doh"); Context context = new ContextBase(); appender.setContext(context); - appender.setName("doh"); // is null OK? appender.doAppend(null); StatusChecker checker = new StatusChecker(context.getStatusManager()); Index: logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java (working copy) @@ -16,7 +16,8 @@ public class DummyAppender extends WriterAppender { - DummyAppender(Writer writer) { + DummyAppender(String name, Writer writer) { + super(name); this.writer = writer; } Index: logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java (working copy) @@ -22,12 +22,12 @@ super(arg); } - protected AppenderBase getAppender() { - return new DummyAppender(new StringWriter()); + protected AppenderBase getAppender(String name) { + return new DummyAppender(name, new StringWriter()); } - protected AppenderBase getConfiguredAppender() { - DummyAppender da = new DummyAppender(new StringWriter()); + protected AppenderBase getConfiguredAppender(String name) { + DummyAppender da = new DummyAppender(name, new StringWriter()); da.setLayout(new NopLayout()); da.start(); return da; @@ -35,7 +35,7 @@ public void testBasic() { StringWriter sw = new StringWriter(); - DummyAppender da = new DummyAppender(sw); + DummyAppender da = new DummyAppender("test", sw); da.setLayout(new DummyLayout()); da.start(); da.doAppend(new Object()); Index: logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/NOPAppender.java (working copy) @@ -4,6 +4,10 @@ public class NOPAppender extends AppenderBase { + public NOPAppender(String name) { + super(name); + } + @Override protected void append(E eventObject) { } Index: logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java =================================================================== --- logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java (revision 1828) +++ logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java (working copy) @@ -35,15 +35,14 @@ super.tearDown(); } - protected AppenderBase getAppender() { - return new FileAppender(); + protected AppenderBase getAppender(String name) { + return new FileAppender(name); } - protected AppenderBase getConfiguredAppender() { - FileAppender appender = new FileAppender(); + protected AppenderBase getConfiguredAppender(String name) { + FileAppender appender = new FileAppender(name); appender.setLayout(new NopLayout()); appender.setFile("temp.log"); - appender.setName("temp.log"); appender.setContext(new ContextBase()); appender.start(); return appender; @@ -52,11 +51,10 @@ public void test() { String filename = Constants.OUTPUT_DIR_PREFIX+"temp.log"; - FileAppender appender = new FileAppender(); + FileAppender appender = new FileAppender("temp.log"); appender.setLayout(new DummyLayout()); appender.setAppend(false); appender.setFile(filename); - appender.setName("temp.log"); appender.setContext(new ContextBase()); appender.start(); appender.doAppend(new Object()); @@ -71,11 +69,10 @@ int diff = new Random().nextInt(100); String filename = Constants.OUTPUT_DIR_PREFIX+"/fat"+diff+"/testing.txt"; File file = new File(filename); - FileAppender appender = new FileAppender(); + FileAppender appender = new FileAppender("testCreateParentFolders"); appender.setLayout(new DummyLayout()); appender.setAppend(false); appender.setFile(filename); - appender.setName("testCreateParentFolders"); appender.setContext(new ContextBase()); appender.start(); appender.doAppend(new Object()); Index: logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java (working copy) @@ -36,6 +36,10 @@ protected abstract Method getGeneratedKeysMethod(); protected abstract String getInsertSQL(); + + protected DBAppenderBase(String name) { + super(name); + } @Override public void start() { Index: logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java (working copy) @@ -56,6 +56,10 @@ // reset the ObjectOutputStream every 70 calls private static final int RESET_FREQUENCY = 70; + protected SocketAppenderBase(String name) { + super(name); + } + // /** // * Connect to the specified RemoteHost and Port. // */ @@ -71,14 +75,14 @@ if (port == 0) { errorCount++; addError("No port was configured for appender" - + name + + getName() + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_port"); } if (address == null) { errorCount++; addError("No remote address was configured for appender" - + name + + getName() + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_host"); } @@ -152,7 +156,7 @@ if (address == null) { addError("No remote host is set for SocketAppender named \"" - + this.name + + getName() + "\". For more information, please visit http://logback.qos.ch/codes.html#socket_no_host"); return; } Index: logback-core/src/main/java/ch/qos/logback/core/net/JMSAppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/net/JMSAppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/net/JMSAppenderBase.java (working copy) @@ -29,6 +29,10 @@ protected String providerURL; protected String userName; protected String password; + + protected JMSAppenderBase(String name) { + super(name); + } protected Object lookup(Context ctx, String name) throws NamingException { Index: logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java (working copy) @@ -20,6 +20,10 @@ SyslogWriter sw; int port = SyslogConstants.SYSLOG_PORT; + protected SyslogAppenderBase(String name) { + super(name); + } + public void start() { int errorCount = 0; if (facilityStr == null) { Index: logback-core/src/main/java/ch/qos/logback/core/net/TelnetAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/net/TelnetAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/net/TelnetAppender.java (working copy) @@ -4,7 +4,11 @@ public class TelnetAppender extends AppenderBase { - int port; + int port; + + public TelnetAppender(String name) { + super(name); + } @Override public void start() { @@ -12,7 +16,7 @@ if (port == 0) { errorCount++; addError("No port was configured for appender" - + name + + getName() + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_port"); } Index: logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java (working copy) @@ -54,6 +54,10 @@ protected EventEvaluator eventEvaluator; + protected SMTPAppenderBase(String name) { + super(name); + } + /** * return a layout for the subjet string as appropriate for the module. If the * subjectStr parameter is null, then a default value for subjectStr should be @@ -141,13 +145,13 @@ } if (this.eventEvaluator == null) { - addError("No EventEvaluator is set for appender [" + name + "]."); + addError("No EventEvaluator is set for appender [" + getName() + "]."); return false; } if (this.layout == null) { addError("No layout set for appender named [" - + name + + getName() + "]. For more information, please visit http://logback.qos.ch/codes.html#smtp_no_layout"); return false; } Index: logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachable.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachable.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachable.java (working copy) @@ -20,6 +20,10 @@ */ public interface AppenderAttachable { /** + * return the number of Appenders attached. + */ + public long getAppenderCount(); + /** * Add an appender. */ public void addAppender(Appender newAppender); Index: logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java (working copy) @@ -9,21 +9,29 @@ */ package ch.qos.logback.core.spi; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; import ch.qos.logback.core.Appender; /** - * A straightforward implementation of the {@link AppenderAttachable} interface. + * An implementation of the {@link AppenderAttachable} interface. * * @author Ceki Gülcü */ public class AppenderAttachableImpl implements AppenderAttachable { - final private List> appenderList = new ArrayList>(); + private final ConcurrentMap> appenders = + new ConcurrentHashMap>(); + public long getAppenderCount() { + return appenders.size(); + } + /** * Attach an appender. If the appender is already in the list in won't be * added again. @@ -33,21 +41,16 @@ if (newAppender == null) { throw new IllegalArgumentException("Cannot null as an appener"); } - if (!appenderList.contains(newAppender)) { - appenderList.add(newAppender); - } + appenders.putIfAbsent(newAppender.getName(), newAppender); } /** * Call the doAppend method on all attached appenders. */ public int appendLoopOnAppenders(E e) { - int size = 0; - Appender appender; - - size = appenderList.size(); - for (int i = 0; i < size; i++) { - appender = (Appender) appenderList.get(i); + Collection> coll = appenders.values(); + int size = coll.size(); + for (Appender appender : coll) { appender.doAppend(e); } return size; @@ -60,7 +63,7 @@ * @return Enumeration An enumeration of attached appenders. */ public Iterator iteratorForAppenders() { - return appenderList.iterator(); + return appenders.values().iterator(); } /** @@ -74,19 +77,7 @@ if (name == null) { return null; } - - int size = appenderList.size(); - Appender appender; - - for (int i = 0; i < size; i++) { - appender = appenderList.get(i); - - if (name.equals(appender.getName())) { - return appender; - } - } - - return null; + return appenders.get(name); } /** @@ -99,33 +90,17 @@ if (appender == null) { return false; } - - int size = appenderList.size(); - Appender a; - - for (int i = 0; i < size; i++) { - a = (Appender) appenderList.get(i); - - if (a == appender) { - return true; - } - } - - return false; + return appenders.containsKey(appender.getName()); } /** * Remove and stop all previously attached appenders. */ public void detachAndStopAllAppenders() { - int len = appenderList.size(); - - for (int i = 0; i < len; i++) { - Appender a = (Appender) appenderList.get(i); - a.stop(); + for (Map.Entry> entry : appenders.entrySet()) { + entry.getValue().stop(); + appenders.remove(entry.getKey(), entry.getValue()); } - - appenderList.clear(); } /** @@ -136,7 +111,7 @@ if (appender == null) { return false; } - return appenderList.remove(appender); + return appenders.remove(appender.getName(), appender); } /** @@ -147,14 +122,6 @@ if (name == null) { return null; } - - int size = appenderList.size(); - - for (int i = 0; i < size; i++) { - if (name.equals((appenderList.get(i)).getName())) { - return appenderList.remove(i); - } - } - return null; + return appenders.remove(name); } } Index: logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java (working copy) @@ -33,7 +33,8 @@ /** * As in most logback components, the default constructor does nothing. */ - public ConsoleAppender() { + public ConsoleAppender(String name) { + super(name); } /** Index: logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java (working copy) @@ -36,7 +36,8 @@ * The default constructor simply calls its {@link * FileAppender#FileAppender parents constructor}. * */ - public RollingFileAppender() { + public RollingFileAppender(String name) { + super(name); } public void start() { Index: logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java (working copy) @@ -45,23 +45,20 @@ } try { - addInfo("About to instantiate appender of type [" + className + "]"); - - appender = (Appender) OptionHelper.instantiateByClassName(className, - ch.qos.logback.core.Appender.class, context); - - appender.setContext(context); - String appenderName = attributes.getValue(NAME_ATTRIBUTE); - if (OptionHelper.isEmpty(appenderName)) { addWarn("No appender name given for appender of type " + className + "]."); - } else { - appender.setName(appenderName); - addInfo("Naming appender as [" + appenderName + "]"); } + addInfo("About to instantiate appender of type [" + className + "]" + " with name " + appenderName); + Class[] paramClasses = new Class[] { String.class }; + Object[] params = new Object[] { appenderName }; + appender = (Appender) OptionHelper.instantiateByClassName(className, + ch.qos.logback.core.Appender.class, context, paramClasses, params); + + appender.setContext(context); + // The execution context contains a bag which contains the appenders // created thus far. HashMap appenderBag = (HashMap) ec.getObjectMap().get( Index: logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java (working copy) @@ -38,10 +38,14 @@ /** * Appenders are named. */ - protected String name; + private final String name; private FilterAttachableImpl fai = new FilterAttachableImpl(); + protected AppenderBase(String name) { + this.name = name; + } + public String getName() { return name; } @@ -91,13 +95,6 @@ abstract protected void append(E eventObject); - /** - * Set the name of this appender. - */ - public void setName(String name) { - this.name = name; - } - public void start() { started = true; } Index: logback-core/src/main/java/ch/qos/logback/core/read/CyclicBufferAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/read/CyclicBufferAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/read/CyclicBufferAppender.java (working copy) @@ -24,6 +24,10 @@ CyclicBuffer cb; int maxSize = 512; + public CyclicBufferAppender(String name) { + super(name); + } + public void start() { cb = new CyclicBuffer(maxSize); super.start(); Index: logback-core/src/main/java/ch/qos/logback/core/read/ListAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/read/ListAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/read/ListAppender.java (working copy) @@ -17,6 +17,10 @@ public class ListAppender extends AppenderBase { public List list = new ArrayList(); + + public ListAppender(String name) { + super(name); + } protected void append(E e) { list.add(e); Index: logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java (working copy) @@ -63,7 +63,8 @@ /** * The default constructor does nothing. */ - public WriterAppender() { + public WriterAppender(String name) { + super(name); } /** @@ -98,14 +99,14 @@ int errors = 0; if (this.layout == null) { addStatus( - new ErrorStatus("No layout set for the appender named \"" + name + new ErrorStatus("No layout set for the appender named \"" + getName() + "\".", this)); errors++; } if (this.writer == null) { addStatus( - new ErrorStatus("No writer set for the appender named \"" + name + new ErrorStatus("No writer set for the appender named \"" + getName() + "\".", this)); errors++; } @@ -222,7 +223,7 @@ } catch (IOException ioe) { this.started = false; addStatus(new ErrorStatus( - "Failed to write header for appender named [" + name + "].", + "Failed to write header for appender named [" + getName() + "].", this, ioe)); } } @@ -244,7 +245,7 @@ } catch (IOException ioe) { this.started = false; addStatus(new ErrorStatus( - "Failed to write footer for appender named [" + name + "].", + "Failed to write footer for appender named [" + getName() + "].", this, ioe)); } } Index: logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java (working copy) @@ -12,6 +12,8 @@ import ch.qos.logback.core.Context; import ch.qos.logback.core.CoreGlobal; +import java.lang.reflect.Constructor; + /** * @author Ceki Gulcu */ @@ -22,6 +24,13 @@ ClassLoader classLoader = context.getClass().getClassLoader(); return instantiateByClassName(className, superClass, classLoader); } + + public static Object instantiateByClassName(String className, + Class superClass, Context context, Class[] paramClasses, Object[] params) + throws IncompatibleClassException, DynamicClassLoadingException { + ClassLoader classLoader = context.getClass().getClassLoader(); + return instantiateByClassName(className, superClass, classLoader, paramClasses, params); + } @SuppressWarnings("unchecked") public static Object instantiateByClassName(String className, @@ -47,6 +56,31 @@ } } + @SuppressWarnings("unchecked") + public static Object instantiateByClassName(String className, + Class superClass, ClassLoader classLoader, Class[] paramClasses, Object[] params) + throws IncompatibleClassException, DynamicClassLoadingException { + + if (className == null) { + throw new NullPointerException(); + } + + try { + Class classObj = null; + classObj = classLoader.loadClass(className); + if (!superClass.isAssignableFrom(classObj)) { + throw new IncompatibleClassException(superClass, classObj); + } + Constructor init = classObj.getConstructor(paramClasses); + return init.newInstance(params); + } catch (IncompatibleClassException ice) { + throw ice; + } catch (Throwable t) { + throw new DynamicClassLoadingException("Failed to instantiate type " + + className, t); + } + } + /** * Find the value corresponding to key in props. * Then perform variable substitution on the found value. Index: logback-core/src/main/java/ch/qos/logback/core/FileAppender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/FileAppender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/FileAppender.java (working copy) @@ -53,7 +53,8 @@ /** * As in most cases, the default constructor does nothing. */ - public FileAppender() { + public FileAppender(String name) { + super(name); } /** @@ -107,7 +108,7 @@ } } else { errors++; - addStatus(new ErrorStatus("File option not set for appender [" + name + addStatus(new ErrorStatus("File option not set for appender [" + getName() + "].", this)); } if (errors == 0) { @@ -128,15 +129,8 @@ * Do not use this method directly. To configure a FileAppender or one of * its subclasses, set its properties one by one and then call start(). * - * @param filename - * The path to the log file. - * @param append - * If true will append to fileName. Otherwise will truncate fileName. - * @param bufferedIO - * @param bufferSize + * @throws IOException if an error occurs opening the file. * - * @throws IOException - * */ public synchronized void openFile() throws IOException { closeWriter(); Index: logback-core/src/main/java/ch/qos/logback/core/Appender.java =================================================================== --- logback-core/src/main/java/ch/qos/logback/core/Appender.java (revision 1828) +++ logback-core/src/main/java/ch/qos/logback/core/Appender.java (working copy) @@ -37,12 +37,5 @@ * Returns this appenders layout. */ public Layout getLayout(); - - /** - * Set the name of this appender. The name is used by other components to - * identify this appender. - * - */ - public void setName(String name); } Index: logback-examples/src/main/java/chapter4/IO.java =================================================================== --- logback-examples/src/main/java/chapter4/IO.java (revision 1828) +++ logback-examples/src/main/java/chapter4/IO.java (working copy) @@ -38,10 +38,11 @@ this.immediateFlush = _immediateFlush; context = new LoggerContext(); logger = context.getLogger("logger-" + getName()); + String logName = getName() + ".log"; // A FileAppender is created according to the buffering and // immediate flush setting of this IO instance. - FileAppender fa = new FileAppender(); + FileAppender fa = new FileAppender(logName); if (longMessage) { PatternLayout pa = new PatternLayout(); @@ -51,7 +52,7 @@ fa.setLayout(new EchoLayout()); } - fa.setFile(getName() + ".log"); + fa.setFile(logName); fa.setAppend(false); fa.setImmediateFlush(immediateFlush); fa.setBufferedIO(buffered); Index: logback-examples/src/main/java/chapter4/socket/SocketClient1.java =================================================================== --- logback-examples/src/main/java/chapter4/socket/SocketClient1.java (revision 1828) +++ logback-examples/src/main/java/chapter4/socket/SocketClient1.java (working copy) @@ -44,7 +44,7 @@ // Create a SocketAppender connected to hostname:port with a // reconnection delay of 10000 seconds. - SocketAppender socketAppender = new SocketAppender(); + SocketAppender socketAppender = new SocketAppender("Socket"); socketAppender.setRemoteHost(hostName); socketAppender.setPort(port); socketAppender.setReconnectionDelay(10000); Index: logback-examples/src/main/java/chapter4/CountingConsoleAppender.java =================================================================== --- logback-examples/src/main/java/chapter4/CountingConsoleAppender.java (revision 1828) +++ logback-examples/src/main/java/chapter4/CountingConsoleAppender.java (working copy) @@ -22,7 +22,8 @@ private Layout layout; - public CountingConsoleAppender() { + public CountingConsoleAppender(String name) { + super(name); } public void setLimit(int limit) { @@ -36,7 +37,7 @@ @Override public void start() { if (this.layout == null) { - addError("No layout set for the appender named ["+ name +"]."); + addError("No layout set for the appender named ["+ getName() +"]."); return; } Index: logback-examples/src/main/java/chapter4/ExitWoes1.java =================================================================== --- logback-examples/src/main/java/chapter4/ExitWoes1.java (revision 1828) +++ logback-examples/src/main/java/chapter4/ExitWoes1.java (working copy) @@ -26,7 +26,7 @@ public static void main(String[] args) throws Exception { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.shutdownAndReset(); // we want to override the default-config. - WriterAppender writerAppender = new WriterAppender(); + WriterAppender writerAppender = new WriterAppender("Writer"); writerAppender.setContext(lc); writerAppender.setLayout(new EchoLayout()); Index: logback-examples/src/main/java/chapter4/ExitWoes2.java =================================================================== --- logback-examples/src/main/java/chapter4/ExitWoes2.java (revision 1828) +++ logback-examples/src/main/java/chapter4/ExitWoes2.java (working copy) @@ -27,11 +27,12 @@ public static void main(String[] args) throws Exception { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.shutdownAndReset();//this is to cancel default-config. - WriterAppender writerAppender = new WriterAppender(); + String name = "exitWoes2.log"; + WriterAppender writerAppender = new WriterAppender(name); writerAppender.setContext(lc); writerAppender.setLayout(new EchoLayout()); - OutputStream os = new FileOutputStream("exitWoes2.log"); + OutputStream os = new FileOutputStream(name); writerAppender.setWriter(new OutputStreamWriter(os)); writerAppender.setImmediateFlush(false); writerAppender.start(); Index: logback-examples/src/main/java/chapter5/PatternSample.java =================================================================== --- logback-examples/src/main/java/chapter5/PatternSample.java (revision 1828) +++ logback-examples/src/main/java/chapter5/PatternSample.java (working copy) @@ -16,7 +16,7 @@ layout.setPattern("%-5level [%thread]: %message%n"); layout.start(); - ConsoleAppender appender = new ConsoleAppender(); + ConsoleAppender appender = new ConsoleAppender("console"); appender.setContext(rootLogger.getLoggerContext()); appender.setLayout(layout); appender.start(); Index: logback-examples/src/main/java/chapter7/SimpleMDC.java =================================================================== --- logback-examples/src/main/java/chapter7/SimpleMDC.java (revision 1828) +++ logback-examples/src/main/java/chapter7/SimpleMDC.java (working copy) @@ -64,7 +64,7 @@ layout.setContext(loggerContext); layout.setPattern("%X{first} %X{last} - %m%n"); layout.start(); - ConsoleAppender appender = new ConsoleAppender(); + ConsoleAppender appender = new ConsoleAppender("console"); appender.setContext(loggerContext); appender.setLayout(layout); appender.start();