miércoles, 22 de julio de 2009

Logs tipo Apache NCSA en framework Restlet... y con DailyRollingFileAppender

El servidor web (ej: jetty) del framework Restlet arroja logs de los requests en formato Apache (NCSA) al logging estándar del JDK.

Para capturar esos logs, colocar en el main de la aplicación:


java.util.logging.Handler fh = new NCSAFileHandler();
java.util.logging.Logger.getLogger("").addHandler(fh);


La clase NCSAFileHandler es sencilla, sólo sobreescribe 1 método de su padre Handler:



public class NCSAFileHandler extends Handler {
...
private static Logger log = Logger.getLogger(NCSAFileHandler.class);;
@Override
public void publish(LogRecord logRecord) {
log.info(logRecord.getMessage());
}
}


Al método publish de NCSAFileHandler le llegarán todos los records (record = mensaje con el resumen del roundtrip de un request) de Restlet. Con publish botamos los records a log4j.

Para que el log de NCSAFileHandler quede en un DailyRollingFileAppender de log4j, en el main de la aplicación:


File ncsaLogFile = new File("/tmp/http_ncsa.log");
DailyRollingFileAppender ncsaAppender = new DailyRollingFileAppender();
ncsaAppender.setFile(ncsaLogFile.getAbsolutePath());
ncsaAppender.setName("DailyRollingFileAppenderNCSA");
ncsaAppender.setDatePattern("'.'yyyy-MM-dd");
ncsaAppender.activateOptions();
PatternLayout ncsaLayout = new PatternLayout("[%t] %m%n");
ncsaAppender.setLayout(ncsaLayout);
Logger ncsaLogger = Logger.getLogger(mipackage.ncsa.NCSAFileHandler.class);
ncsaLogger.addAppender(ncsaAppender);

No hay comentarios: