[logback-user] Changing appenders at runtime

Richard Wallace rwallace at thewallacepack.net
Tue May 1 19:25:25 CEST 2007


Hello,

I'm trying to change the appender used at runtime during testing.  I'm 
using the excellent Unitils project to do my unit testing and am unit 
testing some Hibernate and Spring stuff.  The amount that gets logged is 
too much to do to stdout so I want it to go to a file.  My problem is 
that if I just do it to a single file all the logs run together and you 
have a hard time telling where one test begins and another ends.  So I 
want to change the file that is being logged to for each test.  I've got 
the following bit of code that runs before each test class.

            LoggerContext lc = (LoggerContext) 
LoggerFactory.getILoggerFactory ();
            Logger logger = lc.getLogger (LoggerContext.ROOT_NAME);
            m_originalAppender = (FileAppender) logger.detachAppender 
("FILE");

            String logFile = System.getProperty ("test.log.dir") + 
File.separator
                           + testClass.getName () + ".log";

            FileAppender classAppender = new FileAppender ();
            classAppender.setContext (lc);
            classAppender.setName ("FILE");
            classAppender.setFile (logFile);
            classAppender.setAppend (false);
            classAppender.setLayout (m_originalAppender.getLayout ());
            classAppender.setEncoding (m_originalAppender.getEncoding ());
            classAppender.start ();

and here is the initial logback.xml configuration.

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <File>test.log</File>
    <Append>true</Append>
    <Encoding>UTF-8</Encoding>
    <BufferedIO>false</BufferedIO>
    <ImmediateFlush>true</ImmediateFlush>

    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>
        %-4relative [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </layout>
  </appender>

  <root>
    <level value="debug" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

Logging starts going to the test.log file successfully and then the 
testClass log file gets created, but nothing is logged to it.  I'm sure 
I'm missing something about correctly attaching it or having it listen 
for logging events, but I can't figure out where.  Any hints?

Thanks,
Rich



More information about the Logback-user mailing list