/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2014-2016 ForgeRock AS. */ package org.opends.server.loggers; import java.io.PrintStream; import java.util.logging.ErrorManager; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; /** Utility class for java.util.logging support. */ public class JDKLogging { /** Root packages that contains all OpenDJ related classes. */ private static final String[] LOGGING_ROOTS = new String[] { "org.opends", "org.forgerock.opendj"}; /** Disable java.util.logging. */ public static void disableLogging() { LogManager.getLogManager().reset(); Logger.getLogger("").setLevel(Level.OFF); } /** * Enable JDK logging to stderr at provided level for OpenDJ classes. *
* Error and warning messages will be printed on stderr, other messages will be printed on stdout. */ public static void enableVerboseConsoleLoggingForOpenDJ() { enableConsoleLoggingForOpenDJ(Level.ALL, System.out, System.err); } /** * Enable JDK logging for OpenDJ tool. *
* Error and warning messages will be printed on stderr, other messages will be printed on stdout. * This method should only be used by external tool classes. */ public static void enableConsoleLoggingForOpenDJTool() { enableConsoleLoggingForOpenDJ(Level.FINE, System.out, System.err); } /** * Enable JDK logging in provided {@link PrintStream} for OpenDJ tool. *
* All messages will be printed on the provided {@link PrintStream}. * This method should only be used by external tool classes. * * @param stream * The stream to use to print messages. */ public static void enableLoggingForOpenDJTool(final PrintStream stream) { enableConsoleLoggingForOpenDJ(Level.FINE, stream, stream); } /** * Enable JDK logging at provided {@link Level} in provided {@link PrintStream} for OpenDJ classes. * * @param level * The level to log. * @param out * The stream to use to print messages from {@link Level#FINEST} and {@link Level#INFO} included. * @param err * The stream to use to print {@link Level#SEVERE} and {@link Level#WARNING} messages. */ private static void enableConsoleLoggingForOpenDJ(final Level level, final PrintStream out, final PrintStream err) { LogManager.getLogManager().reset(); Handler handler = new OpenDJHandler(out, err); handler.setFormatter(getFormatter()); handler.setLevel(level); for (String loggingRoot : LOGGING_ROOTS) { Logger logger = Logger.getLogger(loggingRoot); logger.setLevel(level); logger.addHandler(handler); } } /** Custom handler to log to either stdout or stderr depending on the log level. */ private static final class OpenDJHandler extends Handler { private final PrintStream out; private final PrintStream err; private OpenDJHandler(final PrintStream out, final PrintStream err) { this.out = out; this.err = err; } @Override public void publish(LogRecord record) { if (getFormatter() == null) { setFormatter(new SimpleFormatter()); } try { String message = getFormatter().format(record); if (record.getLevel().intValue() >= Level.WARNING.intValue()) { err.write(message.getBytes()); } else { out.write(message.getBytes()); } } catch (Exception exception) { reportError(null, exception, ErrorManager.FORMAT_FAILURE); return; } } @Override public void close() throws SecurityException { } @Override public void flush() { System.out.flush(); System.err.flush(); } } /** * Get a formatter. * * @return a formatter for loggers */ public static Formatter getFormatter() { return new JDKLoggingFormater(); } /** * Returns the packages to be used as root for logging. *
* This package covers all OpenDJ classes. * * @return the root packages to log */ public static String[] getOpendDJLoggingRoots() { return LOGGING_ROOTS; } }