| /*========================================================================= |
| * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. |
| * This product is protected by U.S. and international copyright |
| * and intellectual property laws. Pivotal products are covered by |
| * one or more patents listed at http://www.pivotal.io/patents. |
| *========================================================================= |
| */ |
| package com.gemstone.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 |
| * {@link LEVEL#INFO LEVEL.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 com.gemstone.persistence.admin.Logger.format( format, objs ); |
| } |
| |
| } |