Details
-
Improvement
-
Resolution: Duplicate
-
Minor
-
None
-
None
-
None
-
Operating System: Linux
Platform: PC
-
141
Description
Suggest a new sub-interface of Appender:
public interface FlushableAppender<E> extends Appender<E>, java.io.Flushable
{
}
Then, WriterAppender could be defined to implement FlushableAppender, with this simple implementation:
public void flush() throws IOException
{ writer.flush(); }This would allow manual flushing of the appenders. This is particularly useful when buffered IO is used, obviously. It allows, for instance, to manually flush all appenders when a request has been fully processed, ensuring that we retain the benefits of buffered IO while also having the full logs after request processing.
Here's sample code I used to get all appenders (run once after Logback configuration):
public static Set<Appender> getAllAppenders()
{
ContextSelector selector = StaticLoggerBinder.SINGLETON.getContextSelector();
LoggerContext loggerContext = selector.getLoggerContext();
Map<String, Appender> appenders = newHashMap();
// loop through all Loggers
for ( Logger logger : loggerContext.getLoggerList() )
{
// for each logger, loop through all its appenders
Iterator iter = logger.iteratorForAppenders();
while ( iter.hasNext() )
}
return newHashSet( appenders.values() );
}
The below bean is used in Spring, calling flush() forces all appenders to be flushed:
public class LogbackFlushBean implements Flushable
{
protected final Logger log = LoggerFactory.getLogger( getClass() );
private final Collection<FlushableAppender> flushableAppenders = newLinkedList();
@PostConstruct
public void loadFlushableAppenders()
{
for ( Appender appender : LogbackConfigurer.getAllAppenders() )
{
if ( appender instanceof FlushableAppender )
else
{
log.debug( "appender {} is not Flushable, skipping", appender.getName() );
}
}
}
public void flush() throws IOException
{
for ( FlushableAppender appender : flushableAppenders )
{
log.debug( "flushing appender {}", appender.getName() );
appender.flush();
}
}
}
Attachments
Issue Links
- duplicates
-
LOGBACK-206 FlushingPolicy
- Resolved
- is duplicated by
-
LOGBACK-255 FlushableAppender
- Resolved
-
LOGBACK-286 FlushableAppender
- Resolved