Thank you very much Frank, but this class has to be "registered" somewhere?



2006/7/4, Frank Felix Debatin <[EMAIL PROTECTED]>:

Hi Cosma,

I worked around this by writing a simplistic log handler
that accepts JDK log messages and send them to commons
logging.

Feel free to use, below.

Frank Felix

_______________________

package whatever;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* Writes JDK log messages to commons logging.
*/
public class JDKToCommonsLogging
{
    static JDKLogHandler activeHandler;

    /**
     * Activates this feature.
     */
    public static void activate()
    {
        try
        {
            Logger rootLogger =
LogManager.getLogManager().getLogger("");
            // remove old handlers
            for (Handler handler: rootLogger.getHandlers())
            {
                rootLogger.removeHandler(handler);
            }
            // add our own
            activeHandler = new JDKLogHandler();
            rootLogger.addHandler(activeHandler);
            // done, let's check it right away!!!

Logger.getLogger(JDKToCommonsLogging.class.getName())
                .info("activated: sending JDK log messages
to Commons Logging");
        }
        catch (Exception exc)
        {
            LogFactory.getLog(JDKToCommonsLogging.class)
                .error("activation failed", exc);
        }
    }

    public static void deactivate()
    {
        Logger rootLogger =
LogManager.getLogManager().getLogger("");
        rootLogger.removeHandler(activeHandler);

Logger.getLogger(JDKToCommonsLogging.class.getName())
            .info("dactivated");
    }

    private static class JDKLogHandler extends Handler
    {
        private Map<String, Log> cachedLogs = new
ConcurrentHashMap<String, Log>();

        private Log getLog(String logName)
        {
            Log log = cachedLogs.get(logName);
            if (log==null)
            {
                log = LogFactory.getLog(logName);
                cachedLogs.put(logName, log);
            }
            return log;
        }

        @Override
        public void publish(LogRecord record)
        {
            Log log = getLog(record.getLoggerName());
            String message = record.getMessage();
            Throwable exception = record.getThrown();
            Level level = record.getLevel();
            if (level==Level.SEVERE){
                log.error(message, exception);
            } else if (level==Level.WARNING) {
                log.warn(message, exception);
            } else if (level==Level.INFO) {
                log.info(message, exception);
            } else if (level==Level.CONFIG) {
                log.debug(message, exception);
            } else {
                log.trace(message, exception);
            }
        }

        @Override
        public void flush()
        {
           // nothing to do
        }

        @Override
        public void close()
        {
            // nothing to do
        }
    }
}


Reply via email to