public class ManualRolloverTest
{
@BeforeClass
public static void configureLogback()
{
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
try
{
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
context.reset();
String config = "<configuration debug=\"false\" scan=\"false\">\n" +
" <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n" +
" <file>1.log</file>\n" +
" <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n" +
" <!-- daily rollover -->\n" +
" <fileNamePattern>1.log.%d{yyyyMMdd}</fileNamePattern>\n" +
" <maxHistory>3</maxHistory>\n" +
" <totalSizeCap>1GB</totalSizeCap>\n" +
" </rollingPolicy>\n" +
" </appender>\n" +
" <root level=\"INFO\">\n" +
" <appender-ref ref=\"FILE\" />\n" +
" </root>\n" +
"</configuration>";
configurator.doConfigure(new ByteArrayInputStream(config.getBytes()));
}
catch (JoranException je)
{
}
StatusPrinter.printInCaseOfErrorsOrWarnings(context);
}
@Test
public void checkManualRolloverDoesNotThrowNPE() throws Exception
{
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rollover(logger.iteratorForAppenders());
}
private static void rollover(Iterator<Appender<ILoggingEvent>> it)
{
for (; it.hasNext(); )
{
Appender<ILoggingEvent> appender = it.next();
if (appender instanceof RollingFileAppender)
{
RollingFileAppender rollingFileAppender = (RollingFileAppender) appender;
rollingFileAppender.rollover();
}
else if (appender instanceof AsyncAppender)
{
AsyncAppender asyncAppender = (AsyncAppender) appender;
rollover(asyncAppender.iteratorForAppenders());
}
}
}
}
Here is the unit test. The issue is that TimeBasedFileNamingAndTriggeringPolicyBase.elapsedPeriodsFileName is null at startup time until DefaultTimeBasedFileNamingAndTriggeringPolicy.isTriggeringEvent is called at least once. I'm not aware with logback architecture good enough to provide a patch, but it could be as simple as doing elapsedPeriodsFileName = tbrp.fileNamePatternWithoutCompSuffix.convert(getCurrentTime()); in start() method. |