Thursday, 15 July 2010

spring mvc - redirect java.util.logging to log4j birt -



spring mvc - redirect java.util.logging to log4j birt -

i have spring mvc webapp uses bit reports. birt reports uses java.util.logging. looking way redirect java.util.logging log4.

the instructions @ link detail how i'm having troubles getting solution work.

http://wiki.eclipse.org/birt/faq/deployment#q%3a_can_i_use_log4j_with_birt.3f

i've added class described. added logging.properties webapp /resources directory next contents.

handlers=com.myer.reporting.logging.log4jhandler

i don't think scheme parameter applies since using webapp?

anyway know not working because in application logging directory standard birt logs every time application server re-starts.

can help me clarifying these instructions.

thanks

i don't believe instructions acceptable web application. there single jul whole web server / servlet container.

if generate study using birt api, birt allows set own logger. see method engineconfig.setlogger(). works @ to the lowest degree in birt 4.3.1. follows (it redirects birt logs slf4j, thought should same log4j):

engineconfig config = new engineconfig(); // set logger forwards log messages slf4j // of birt 4.3.1 custom logger accepted if or 1 of parent in birt's root logger list. // see http://git.eclipse.org/c/birt/org.eclipse.birt.git/commit/engine/org.eclipse.birt.report.engine/src/org/eclipse/birt/report/engine/api/impl/enginelogger.java?h=kepler&id=1cb9507c8ce997bf5407a73d9c23487cef002fa9 java.util.logging.logger jullogger = java.util.logging.logger.getlogger("org.eclipse.birt" + ".myapp.slf4jbridge"); jullogger.setuseparenthandlers(false); handler loghandler = new slf4jloghandler(); loghandler.setlevel(level.finest); jullogger.addhandler(loghandler); config.setlogger(jullogger);

and slf4jloghandler implemented follows:

public class slf4jloghandler extends handler { private formatter julformatter = new simplejulformatter(); @override public void publish(logrecord record) { if (record == null) { return; } classloader hanlderclassloader = this.getclass().getclassloader(); classloader contextclassloader = thread.currentthread().getcontextclassloader(); if (hanlderclassloader != contextclassloader) { // not log in foreign contexts /* * check necessary if several web applications "jul slf4j" bridge deployed in same servlet container. * each application has own instance of slf4j logger, mapped same jul logger, * because jul logger loaded root classloader. whereas slf4j loggers loaded respective * webapp classloaders. comparing classloaders known way find out whom jul log record belongs to. */ return; } string loggername = record.getloggername(); if (loggername == null) { loggername = "unknown"; } logger slf4jlogger = loggerfactory.getlogger(loggername); /* * jul levels in descending order are: * <ul> * <li>severe (highest value) * <li>warning * <li>info * <li>config * <li>fine * <li>finer * <li>finest (lowest value) * </ul> */ if (record.getlevel().intvalue() <= level.finest.intvalue()) { if (slf4jlogger.istraceenabled()) { slf4jlogger.trace(julformatter.format(record), record.getthrown()); } } else if (record.getlevel().intvalue() <= level.fine.intvalue()) { if (slf4jlogger.isdebugenabled()) { slf4jlogger.debug(julformatter.format(record), record.getthrown()); } } else if (record.getlevel().intvalue() <= level.info.intvalue()) { if (slf4jlogger.isinfoenabled()) { slf4jlogger.info(julformatter.format(record), record.getthrown()); } } else if (record.getlevel().intvalue() <= level.warning.intvalue()) { if (slf4jlogger.iswarnenabled()) { slf4jlogger.warn(julformatter.format(record), record.getthrown()); } } else if (record.getlevel().intvalue() <= level.severe.intvalue()) { if (slf4jlogger.iserrorenabled()) { slf4jlogger.error(julformatter.format(record), record.getthrown()); } } else if (record.getlevel().intvalue() == level.off.intvalue()) { // logger switched off } else { slf4jlogger.warn("unexpected log level {}.", record.getlevel().intvalue()); if (slf4jlogger.iserrorenabled()) { slf4jlogger.error(julformatter.format(record), record.getthrown()); } } } @override public void flush() { // noop } @override public void close() throws securityexception { // noop } }

this approach works if there several web apps using birt on same server.

spring-mvc log4j birt

No comments:

Post a Comment