blob: 8684a3e5a6e712a8cb0da1b64cabe7ccc4fe3ac0 [file] [log] [blame]
/*
* 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 flex.messaging.log;
import flex.messaging.util.PrettyPrinter;
import flex.messaging.util.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
/**
* The <code>Logger</code> class is used to log out information. It provides named
* methods to log information out at the desired level. Each <code>Logger</code>
* will log information out for a log category that is settable.
*
*
*/
public class Logger
{
/**
* The category this logger send messages for.
*/
private volatile String category;
/**
* The list of targets that this logger will dispatch log events to.
*/
private final ArrayList targets;
/**
* Constructs a <code>Logger</code> instance that will log
* information out to the specified category.
*
* @param category The category to log information for.
*/
public Logger(String category)
{
this.category = category;
targets = new ArrayList();
}
/**
* Returns the category this <code>Logger</code> logs information for.
*
* @return The category this <code>Logger</code> logs information for.
*/
public String getCategory()
{
return category;
}
/**
* Determines whether the <code>Logger</code> has at least one target.
*
* @return True if the <code>Logger</code> has one or more targets.
*/
public boolean hasTarget()
{
synchronized (targets)
{
return !targets.isEmpty();
}
}
/**
* Adds a <code>Target</code> that will format and output log events
* generated by this <code>Logger</code>.
*
* @param target The <code>Target</code> to add.
*/
void addTarget(Target target)
{
synchronized (targets)
{
if (!targets.contains(target))
targets.add(target);
}
}
/**
* Removes a <code>Target</code> from this <code>Logger</code>.
*
* @param target The <code>Target</code> to remove.
*/
void removeTarget(Target target)
{
synchronized (targets)
{
targets.remove(target);
}
}
/*
* DEBUG
*/
/**
* Logs out a debug message.
*
* @param message The message to log.
*/
public void debug(String message)
{
log(LogEvent.DEBUG, message, null, null);
}
/**
* Logs out a debug message associated with a <code>Throwable</code>.
*
* @param message The message to log.
* @param t The associated <code>Throwable</code>.
*/
public void debug(String message, Throwable t)
{
log(LogEvent.DEBUG, message, null, t);
}
/**
* Logs out a debug message supporting positional parameter substitutions.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
*/
public void debug(String message, Object[] parameters)
{
log(LogEvent.DEBUG, message, parameters, null);
}
/**
* Logs out a debug message supporting positional parameter substitutions and an
* associated <code>Throwable</code>.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
* @param t The associated <code>Throwable</code>.
*/
public void debug(String message, Object[] parameters, Throwable t)
{
log(LogEvent.DEBUG, message, parameters, t);
}
/*
* INFO
*/
/**
* Logs out an info message.
*
* @param message The message to log.
*/
public void info(String message)
{
log(LogEvent.INFO, message, null, null);
}
/**
* Logs out an info message associated with a <code>Throwable</code>.
*
* @param message The message to log.
* @param t The associated <code>Throwable</code>.
*/
public void info(String message, Throwable t)
{
log(LogEvent.INFO, message, null, t);
}
/**
* Logs out an info message supporting positional parameter substitutions.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
*/
public void info(String message, Object[] parameters)
{
log(LogEvent.INFO, message, parameters, null);
}
/**
* Logs out an info message supporting positional parameter substitutions and an
* associated <code>Throwable</code>.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
* @param t The associated <code>Throwable</code>.
*/
public void info(String message, Object[] parameters, Throwable t)
{
log(LogEvent.INFO, message, parameters, t);
}
/*
* WARN
*/
/**
* Logs out a warn message.
*
* @param message The message to log.
*/
public void warn(String message)
{
log(LogEvent.WARN, message, null, null);
}
/**
* Logs out a warn message associated with a <code>Throwable</code>.
*
* @param message The message to log.
* @param t The associated <code>Throwable</code>.
*/
public void warn(String message, Throwable t)
{
log(LogEvent.WARN, message, null, t);
}
/**
* Logs out a warn message supporting positional parameter substitutions.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
*/
public void warn(String message, Object[] parameters)
{
log(LogEvent.WARN, message, parameters, null);
}
/**
* Logs out a warn message supporting positional parameter substitutions and an
* associated <code>Throwable</code>.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
* @param t The associated <code>Throwable</code>.
*/
public void warn(String message, Object[] parameters, Throwable t)
{
log(LogEvent.WARN, message, parameters, t);
}
/*
* ERROR
*/
/**
* Logs out an error message.
*
* @param message The message to log.
*/
public void error(String message)
{
log(LogEvent.ERROR, message, null, null);
}
/**
* Logs out an error message associated with a <code>Throwable</code>.
*
* @param message The message to log.
* @param t The associated <code>Throwable</code>.
*/
public void error(String message, Throwable t)
{
log(LogEvent.ERROR, message, null, t);
}
/**
* Logs out an error message supporting positional parameter substitutions.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
*/
public void error(String message, Object[] parameters)
{
log(LogEvent.ERROR, message, parameters, null);
}
/**
* Logs out an error message supporting positional parameter substitutions and an
* associated <code>Throwable</code>.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
* @param t The associated <code>Throwable</code>.
*/
public void error(String message, Object[] parameters, Throwable t)
{
log(LogEvent.ERROR, message, parameters, t);
}
/*
* FATAL
*/
/**
* Logs out a fatal message.
*
* @param message The message to log.
*/
public void fatal(String message)
{
log(LogEvent.FATAL, message, null, null);
}
/**
* Logs out a fatal message associated with a <code>Throwable</code>.
*
* @param message The message to log.
* @param t The associated <code>Throwable</code>.
*/
public void fatal(String message, Throwable t)
{
log(LogEvent.FATAL, message, null, t);
}
/**
* Logs out a fatal message supporting positional parameter substitutions.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
*/
public void fatal(String message, Object[] parameters)
{
log(LogEvent.FATAL, message, parameters, null);
}
/**
* Logs out a fatal message supporting positional parameter substitutions and an
* associated <code>Throwable</code>.
*
* @param message The message to log.
* @param parameters Parameters to substitute into the message.
* @param t The associated <code>Throwable</code>.
*/
public void fatal(String message, Object[] parameters, Throwable t)
{
log(LogEvent.FATAL, message, parameters, t);
}
/**
*
* The methods named according to log level delegate to this method to log.
*
* @param level The log level.
* @param message The message to log.
* @param parameters Substitution parameters (may be null).
* @param t The associated <code>Throwable</code> (may be null).
*/
public void log(short level, String message, Object[] parameters, Throwable t)
{
log(level, message, parameters, t, true);
}
/**
*
* Logs a passed message if its level verifies as high enough.
*
* @param level The log level.
* @param message The message to log.
* @param parameters Substitution parameters (may be null).
* @param t The associated <code>Throwable</code>.
* @param verifyLevel <code>true</code> to verify the log level; otherwise log without verifying the level.
*/
public void log(short level, String message, Object[] parameters, Throwable t, boolean verifyLevel)
{
if (targets.size() > 0 && (!verifyLevel || (level >= Log.getTargetLevel())))
{
if (parameters != null)
{
PrettyPrinter prettyPrinter = Log.getPrettyPrinter();
// replace all of the parameters in the msg string
for(int i = 0; i < parameters.length; i++)
{
String replacement = parameters[i] != null ? prettyPrinter.prettify(parameters[i]) : "null";
//this guy runs into problems if the replacement has a \ or $ in it
//message = message.replaceAll("\\{" + i + "\\}", replacement);
message = StringUtils.substitute(message, "{" + i + "}", replacement);
}
}
LogEvent event = new LogEvent(this, message, level, t);
Target tgt;
synchronized (targets)
{
for (Iterator iter = targets.iterator(); iter.hasNext();)
{
tgt = (Target) iter.next();
if (!verifyLevel || (level >= tgt.getLevel()))
tgt.logEvent(event);
}
}
}
}
}