/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.apache.persistence.logging; import java.util.*; /** * A logger is used to record messages and events. Each entry has a given level associated with it. * There are a number of convenience methods for logging events. Events with a level above a certain * are written to <code>System.err</code>. The default level is INFO */ public class Logger { private static boolean DEBUG = Boolean.getBoolean("Logging.DEBUG"); /** Maps the names of Loggers to the Logger */ private static Map loggers = new HashMap(); /** The name of this logger */ private String name; /** * The maximum level at which messages are logged. Message level lower than this value will be * ignored. */ private Level level; /** The Handlers to which this logger's records are sent */ private Set handlers; /** * Creates a new <code>Logger</code> with the given name */ protected Logger(String name) { this.name = name; // Uses a system property to set the level String prop = System.getProperty(name + ".LEVEL"); if (prop != null) { this.level = Level.parse(prop); } else { this.level = Level.INFO; } this.handlers = new HashSet(); // By default, log to System.err this.handlers.add(new StreamHandler(System.err, new SimpleFormatter())); } /** * Returns the logger with the given name */ public synchronized static Logger getLogger(String name) { Logger logger = (Logger) loggers.get(name); if (logger == null) { logger = new Logger(name); loggers.put(name, logger); } // Assert.assertTrue(logger != null); (cannot be null) return (logger); } /** * Adds a Handler to receive logging messages */ public synchronized void addHandler(Handler handler) { this.handlers.add(handler); } /** * Returns the Handlers associated with this logger */ public synchronized Handler[] getHandlers() { return ((Handler[]) this.handlers.toArray(new Handler[0])); } /** * Removes a Handler from this logger */ public synchronized void removeHandler(Handler handler) { this.handlers.remove(handler); } /** * Returns the log level specifying which messages will be logged by this logger. */ public synchronized Level getLevel() { return (this.level); } /** * Sets the log level specifying which messages will be logged by this logger. */ public synchronized void setLevel(Level level) { this.level = level; } /** * Check if a message of the given level would actually be logged by this logger. */ public synchronized boolean isLoggable(Level msgLevel) { if (msgLevel.equals(Level.ALL)) { // Always log Level.ALL messages. Is this a logic error? return (true); } else { return (msgLevel.intValue() >= this.level.intValue()); } } /** * Prints the given log record to System.err */ public synchronized void log(LogRecord record) { if (!isLoggable(record.getLevel())) { // This record is beneath us return; } if (DEBUG) { System.out.println("Logging " + record); } // Publish the record to each handler Iterator iter = this.handlers.iterator(); while (iter.hasNext()) { Handler handler = (Handler) iter.next(); handler.publish(record); handler.flush(); } } /** * Logs a CONFIG message */ public synchronized void config(String msg) { LogRecord record = new LogRecord(Level.CONFIG, msg); log(record); } /** * Log a CONFIG message, with an array of object arguments. */ public synchronized void config(String msg, Object[] params) { LogRecord record = new LogRecord(Level.CONFIG, msg); record.setParameters(params); log(record); } /** * Log a CONFIG message, specifying source class and method. */ public synchronized void config(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.CONFIG, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a CONFIG message, specifying source class and method, with an array of object arguments. */ public synchronized void config(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.CONFIG, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Log a procedure entry. */ public synchronized void entering(String sourceClass, String sourceMethod) { LogRecord record = new LogRecord(Level.CONFIG, "Entering method"); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a procedure entry, with parameters. */ public synchronized void entering(String sourceClass, String sourceMethod, Object[] params) { LogRecord record = new LogRecord(Level.CONFIG, "Entering method"); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Log a procedure return. */ public synchronized void exiting(String sourceClass, String sourceMethod) { LogRecord record = new LogRecord(Level.CONFIG, "Exiting method"); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a procedure return, with parameters. */ public synchronized void exiting(String sourceClass, String sourceMethod, Object[] params) { LogRecord record = new LogRecord(Level.CONFIG, "Exiting method"); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Logs a FINE message */ public synchronized void fine(String msg) { LogRecord record = new LogRecord(Level.FINE, msg); log(record); } /** * Log a FINE message, with an array of object arguments. */ public synchronized void fine(String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINE, msg); record.setParameters(params); log(record); } /** * Log a FINE message, specifying source class and method. */ public synchronized void fine(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.FINE, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a FINE message, specifying source class and method, with an array of object arguments. */ public synchronized void fine(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINE, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Logs a FINER message */ public synchronized void finer(String msg) { LogRecord record = new LogRecord(Level.FINER, msg); log(record); } /** * Log a FINER message, with an array of object arguments. */ public synchronized void finer(String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINER, msg); record.setParameters(params); log(record); } /** * Log a FINER message, specifying source class and method. */ public synchronized void finer(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.FINER, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a FINER message, specifying source class and method, with an array of object arguments. */ public synchronized void finer(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINER, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Logs a FINEST message */ public synchronized void finest(String msg) { LogRecord record = new LogRecord(Level.FINEST, msg); log(record); } /** * Log a FINEST message, with an array of object arguments. */ public synchronized void finest(String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINEST, msg); record.setParameters(params); log(record); } /** * Log a FINEST message, specifying source class and method. */ public synchronized void finest(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.FINEST, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a FINEST message, specifying source class and method, with an array of object arguments. */ public synchronized void finest(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.FINEST, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Logs a INFO message */ public synchronized void info(String msg) { LogRecord record = new LogRecord(Level.INFO, msg); log(record); } /** * Log a INFO message, with an array of object arguments. */ public synchronized void info(String msg, Object[] params) { LogRecord record = new LogRecord(Level.INFO, msg); record.setParameters(params); log(record); } /** * Log a INFO message, specifying source class and method. */ public synchronized void info(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.INFO, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a INFO message, specifying source class and method, with an array of object arguments. */ public synchronized void info(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.INFO, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Logs a message */ public synchronized void log(Level msgLevel, String msg) { LogRecord record = new LogRecord(msgLevel, msg); log(record); } /** * Log a message, with an array of object arguments. */ public synchronized void log(Level msgLevel, String msg, Object[] params) { LogRecord record = new LogRecord(msgLevel, msg); record.setParameters(params); log(record); } /** * Log a message, specifying source class and method. */ public synchronized void log(Level msgLevel, String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(msgLevel, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a message, specifying source class and method, with an array of object arguments. */ public synchronized void log(Level msgLevel, String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(msgLevel, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Log a message, specifying source class and method, with associated Throwable information. */ public synchronized void log(Level msgLevel, String sourceClass, String sourceMethod, String msg, Throwable thrown) { LogRecord record = new LogRecord(msgLevel, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setThrown(thrown); log(record); } /** * Log a message, with associated Throwable information. */ public synchronized void log(Level msgLevel, String msg, Throwable thrown) { LogRecord record = new LogRecord(msgLevel, msg); record.setThrown(thrown); log(record); } /** * Logs a SEVERE message */ public synchronized void severe(String msg) { LogRecord record = new LogRecord(Level.SEVERE, msg); log(record); } /** * Log a SEVERE message, with an array of object arguments. */ public synchronized void severe(String msg, Object[] params) { LogRecord record = new LogRecord(Level.SEVERE, msg); record.setParameters(params); log(record); } /** * Log a SEVERE message, specifying source class and method. */ public synchronized void severe(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.SEVERE, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a SEVERE message, specifying source class and method, with an array of object arguments. */ public synchronized void severe(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.SEVERE, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Log throwing an exception. The logging is done using the FINER level. */ public synchronized void throwing(String sourceClass, String sourceMethod, Throwable thrown) { LogRecord record = new LogRecord(Level.FINER, "THROWN"); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setThrown(thrown); log(record); } /** * Logs a WARNING message */ public synchronized void warning(String msg) { LogRecord record = new LogRecord(Level.WARNING, msg); log(record); } /** * Log a WARNING message, with an array of object arguments. */ public synchronized void warning(String msg, Object[] params) { LogRecord record = new LogRecord(Level.WARNING, msg); record.setParameters(params); log(record); } /** * Log a WARNING message, specifying source class and method. */ public synchronized void warning(String sourceClass, String sourceMethod, String msg) { LogRecord record = new LogRecord(Level.WARNING, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); log(record); } /** * Log a WARNING message, specifying source class and method, with an array of object arguments. */ public synchronized void warning(String sourceClass, String sourceMethod, String msg, Object[] params) { LogRecord record = new LogRecord(Level.WARNING, msg); record.setSourceClassName(sourceClass); record.setSourceMethodName(sourceMethod); record.setParameters(params); log(record); } /** * Formats a message. Takes special care when invoking the toString() method of objects that might * cause NPEs. */ public static String format(String format, Object[] objs) { return org.apache.persistence.admin.Logger.format(format, objs); } }