// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.util.log; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.text.MessageFormat; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; import java.util.regex.Pattern; /** * Redirect java.util.logging events to Jetty Log */ public class JettyLogHandler extends java.util.logging.Handler { public static void config() { ClassLoader cl = Thread.currentThread().getContextClassLoader(); URL url = cl.getResource("logging.properties"); if (url != null) { System.err.printf("Initializing java.util.logging from %s%n",url); try (InputStream in = url.openStream()) { LogManager.getLogManager().readConfiguration(in); } catch (IOException e) { e.printStackTrace(System.err); } } else { System.err.printf("WARNING: java.util.logging failed to initialize: logging.properties not found%n"); } System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Jdk14Logger"); } public JettyLogHandler() { if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.DEBUG","false"))) { setLevel(Level.FINEST); } if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.IGNORED","false"))) { setLevel(Level.ALL); } System.err.printf("%s Initialized at level [%s]%n",this.getClass().getName(),getLevel().getName()); } private synchronized String formatMessage(LogRecord record) { String msg = getMessage(record); try { Object params[] = record.getParameters(); if ((params == null) || (params.length == 0)) { return msg; } if (Pattern.compile("\\{\\d+\\}").matcher(msg).find()) { return MessageFormat.format(msg,params); } return msg; } catch (Exception ex) { return msg; } } private String getMessage(LogRecord record) { ResourceBundle bundle = record.getResourceBundle(); if (bundle != null) { try { return bundle.getString(record.getMessage()); } catch (java.util.MissingResourceException ex) { } } return record.getMessage(); } @Override public void publish(LogRecord record) { org.eclipse.jetty.util.log.Logger JLOG = getJettyLogger(record.getLoggerName()); int level = record.getLevel().intValue(); if (level >= Level.OFF.intValue()) { // nothing to log, skip it. return; } Throwable cause = record.getThrown(); String msg = formatMessage(record); if (level >= Level.WARNING.intValue()) { // log at warn if (cause != null) { JLOG.warn(msg,cause); } else { JLOG.warn(msg); } return; } if (level >= Level.INFO.intValue()) { // log at info if (cause != null) { JLOG.info(msg,cause); } else { JLOG.info(msg); } return; } if (level >= Level.FINEST.intValue()) { // log at debug if (cause != null) { JLOG.debug(msg,cause); } else { JLOG.debug(msg); } return; } if (level >= Level.ALL.intValue()) { // only corresponds with ignore (in jetty speak) JLOG.ignore(cause); return; } } private Logger getJettyLogger(String loggerName) { return org.eclipse.jetty.util.log.Log.getLogger(loggerName); } @Override public void flush() { // ignore } @Override public void close() throws SecurityException { // ignore } }