/*
* Copyright (c) 2004-2005 SLF4J.ORG
* Copyright (c) 2004-2005 QOS.ch
*
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons
* to whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
* OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
* SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Except as contained in this notice, the name of a copyright holder
* shall not be used in advertising or otherwise to promote the sale, use
* or other dealings in this Software without prior written authorization
* of the copyright holder.
*
*/
package org.slf4j.impl;
import org.slf4j.Logger;
/**
* A simple (and direct) implementation that logs messages of level INFO or
* higher on the console (<code>System.err<code>).
*
* <p>The output includes the relative time in milliseconds, thread
* name, the level, logger name, and the message followed by the line
* separator for the host. In log4j terms it amounts to the "%r [%t]
* %level %logger - %m%n" pattern. </p>
*
* <p>Sample output follows.</p>
<pre>
176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order.
225 [main] INFO examples.SortAlgo - Entered the sort method.
304 [main] INFO examples.SortAlgo - Dump of integer array:
317 [main] INFO examples.SortAlgo - Element [0] = 0
331 [main] INFO examples.SortAlgo - Element [1] = 1
343 [main] INFO examples.Sort - The next log statement should be an error message.
346 [main] ERROR examples.SortAlgo - Tried to dump an uninitialized array.
at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
at org.log4j.examples.Sort.main(Sort.java:64)
467 [main] INFO examples.Sort - Exiting main method.
</pre>
*
* <p>
* Modified version to support CLDC 1.1
*
* @author Ceki Gülcü
* @author Marcel Patzlaff
*/
public final class SimpleLogger implements Logger {
/**
* Mark the time when this class gets loaded into memory.
*/
private static final long START_TIME= System.currentTimeMillis();
private static final String TRACE_STR= "TRACE";
private static final String DEBUG_STR= "DEBUG";
private static final String INFO_STR= "INFO";
private static final String WARN_STR= "WARN";
private static final String ERROR_STR= "ERROR";
private final String name;
private final int logLevel;
/**
* Package access allows only {@link SimpleLoggerFactory} to instantiate
* SimpleLogger instances.
*/
SimpleLogger(String name, int logLevel) {
this.name= name;
this.logLevel= logLevel;
}
public String getName() {
return name;
}
public boolean isTraceEnabled() {
return logLevel >= 5;
}
public void trace(String msg) {
if(isTraceEnabled()) {
log(TRACE_STR, msg, null);
}
}
public void trace(String msg, Throwable t) {
if(isTraceEnabled()) {
log(TRACE_STR, msg, t);
}
}
public boolean isDebugEnabled() {
return logLevel >= 4;
}
public void debug(String msg) {
if(isDebugEnabled()) {
log(DEBUG_STR, msg, null);
}
}
public void debug(String msg, Throwable t) {
if(isDebugEnabled()) {
log(DEBUG_STR, msg, t);
}
}
/**
* This is our internal implementation for logging regular
* (non-parameterized) log messages.
*
* @param level
* @param message
* @param t
*/
private void log(String level, String message, Throwable t) {
StringBuffer buf= new StringBuffer();
long millis= System.currentTimeMillis();
buf.append(millis - START_TIME);
buf.append(" [");
buf.append(Thread.currentThread().getName());
buf.append("] ");
buf.append(level);
buf.append(" ");
buf.append(name);
buf.append(" - ");
buf.append(message);
System.err.println(buf.toString());
if (t != null) {
t.printStackTrace();
}
}
public boolean isInfoEnabled() {
return logLevel >= 3;
}
/**
* A simple implementation which always logs messages of level INFO
* according to the format outlined above.
*/
public void info(String msg) {
if(isInfoEnabled()) {
log(INFO_STR, msg, null);
}
}
/**
* Log a message of level INFO, including an exception.
*/
public void info(String msg, Throwable t) {
if(isInfoEnabled()) {
log(INFO_STR, msg, t);
}
}
public boolean isWarnEnabled() {
return logLevel >= 2;
}
/**
* A simple implementation which always logs messages of level WARN
* according to the format outlined above.
*/
public void warn(String msg) {
if(isWarnEnabled()) {
log(WARN_STR, msg, null);
}
}
/**
* Log a message of level WARN, including an exception.
*/
public void warn(String msg, Throwable t) {
if(isWarnEnabled()) {
log(WARN_STR, msg, t);
}
}
public boolean isErrorEnabled() {
return logLevel >= 1;
}
/**
* A simple implementation which always logs messages of level ERROR
* according to the format outlined above.
*/
public void error(String msg) {
if(isErrorEnabled()) {
log(ERROR_STR, msg, null);
}
}
/**
* Log a message of level ERROR, including an exception.
*/
public void error(String msg, Throwable t) {
if(isErrorEnabled()) {
log(ERROR_STR, msg, t);
}
}
}