jueves, marzo 05, 2015

Async loggin with log4j 1.x

If you are reading this surely you have found out that using AsyncAppender its not clearly documented and most of your google results lead you to some log4j 2.X.

Ok, in that case this is the right post for you.

Lets take an ordinary (synchronous) file logger from Log4j 1.x ( tested with 1.2.17) and wrap it up with a 'cool' AsyncAppender. :D.

Considering that you have

import org.slf4j.Logger
...
static Logger log = LoggerFactory.getLogger("MyLogger");

You turn your internal sync appender into an async with:

static {
  AsyncAppenderBuilder.wrapAsyncAppender(log, "MyAppndrName")
}

Then use just like a regular logger

The helping class looks like this:

import org.apache.log4j.Appender
import org.apache.log4j.AsyncAppender
import org.slf4j.impl.Log4jLoggerAdapter
/**
* Replaces the original sync appender with an async appender
* @author arrizabalaga
*/
class AsyncAppenderBuilder {
private static int DEFAULT_BUFFER_SIZE=500
/**
* Looks for an appender in the logger, wraps it with an async and deletes the original appender.
* @param loggerAdapter slf4j logger adapter
* @param nombreAppender name of the sync appender to be wrapped
*/
static void wrapAsyncAppender(Log4jLoggerAdapter loggerAdapter,String appenderName,int bufferSize=DEFAULT_BUFFER_SIZE) {
//Take original appender
org.apache.log4j.Logger log4jLogger=loggerAdapter.logger
Appender syncAppender=log4jLogger.getAppender(appenderName)
//Wrap it
AsyncAppender asyncAppender=new AsyncAppender()
asyncAppender.setBufferSize(bufferSize)
asyncAppender.addAppender(syncAppender)
//Add the async
log4jLogger.addAppender(asyncAppender)
//Remove the sync
log4jLogger.removeAppender(syncAppender)
}
}
Hope it helps!
Iván.

No hay comentarios: