/**
* Copyright 2008 - 2009
*
* Licensed 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.
*
* @project loonframework
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
package loon.log;
import loon.LSystem;
import loon.Log.Level;
final public class LogImpl {
public void exception(Object o) {
System.err.println(o);
}
public void debugWrite(String text) {
System.out.println(text);
}
private static final int MAX_LOG_MESSAGES = 128;
private static LogMessage[] store;
private static int oldestMessageIndex;
private static int newestMessageIndex;
private Level level = Level.INFO;
private LogFormat logFormat;
private String app;
static {
clear();
}
LogImpl(Class<?> clazz) {
this(LSystem.getExtension(clazz.getName()), 0);
}
LogImpl(String app, int type) {
this.logFormat = new LogFormat(true, type);
this.app = app;
this.level = Level.ALL;
}
public Level getLogLevel() {
return level;
}
/**
* 设定当前日志等级
*
* @param level
*/
public void setLevel(int level) {
if (level == Level.DEBUG.id) {
this.level = Level.DEBUG;
} else if (level == Level.INFO.id) {
this.level = Level.INFO;
} else if (level == Level.WARN.id) {
this.level = Level.WARN;
} else if (level == Level.ERROR.id) {
this.level = Level.ERROR;
} else if (level == Level.IGNORE.id) {
this.level = Level.IGNORE;
} else if (level == Level.ALL.id) {
this.level = Level.ALL;
} else {
throw new IllegalArgumentException("Levels of error messages !");
}
}
public void setLevel(Level level) {
this.level = level;
}
public boolean isVisible() {
return logFormat.isShow();
}
public void setVisible(boolean show) {
logFormat.setShow(show);
}
public void hide() {
setVisible(false);
}
public void show() {
setVisible(true);
}
public void d(String message) {
if (level.id == Level.ALL.id || level.id <= Level.DEBUG.id) {
addLogMessage(message, Level.DEBUG, null);
}
}
public void d(String message, Throwable tw) {
if (level.id == Level.ALL.id || level.id <= Level.DEBUG.id) {
addLogMessage(message, Level.DEBUG, tw);
}
}
public void i(String message) {
if (level.id == Level.ALL.id || level.id <= Level.INFO.id) {
addLogMessage(message, Level.INFO, null);
}
}
public void i(String message, Throwable tw) {
if (level.id <= Level.INFO.id) {
addLogMessage(message, Level.INFO, tw);
}
}
public void w(String message) {
if (level.id == Level.ALL.id || level.id <= Level.WARN.id) {
addLogMessage(message, Level.WARN, null);
}
}
public void w(String message, Throwable tw) {
if (level.id == Level.ALL.id || level.id <= Level.WARN.id) {
addLogMessage(message, Level.WARN, tw);
}
}
public void e(String message) {
if (level.id == Level.ALL.id || level.id <= Level.ERROR.id) {
addLogMessage(message, Level.ERROR, null);
}
}
public void e(String message, Throwable tw) {
if (level.id <= Level.ERROR.id) {
addLogMessage(message, Level.ERROR, tw);
}
}
public LogFormat getLogFormat() {
return logFormat;
}
public boolean isDebugEnabled() {
return level.id <= Level.DEBUG.id;
}
public boolean isInfoEnabled() {
return level.id <= Level.INFO.id;
}
/**
* 添加对应的日志记录
*
* @param message
* @param level
* @param throwable
*/
public void addLogMessage(String message, Level level, Throwable throwable) {
if (message == null) {
message = "";
}
String text = message;
if (throwable != null) {
text += " " + throwable.toString();
}
newestMessageIndex = (newestMessageIndex + 1) % MAX_LOG_MESSAGES;
if (newestMessageIndex == oldestMessageIndex) {
store[newestMessageIndex].setLogMessage(level, text);
oldestMessageIndex = (oldestMessageIndex + 1) % MAX_LOG_MESSAGES;
} else {
store[newestMessageIndex] = new LogMessage(level, text);
if (oldestMessageIndex < 0) {
oldestMessageIndex = 0;
}
}
LogMessage log = store[newestMessageIndex];
logFormat.out(log.time, app, log.level.levelString, log.message);
if (throwable != null) {
throwable.printStackTrace(System.err);
}
}
public synchronized LogMessage[] getLogMessages() {
int numberOfMessages;
if (newestMessageIndex < 0) {
numberOfMessages = 0;
} else if (newestMessageIndex >= oldestMessageIndex) {
numberOfMessages = newestMessageIndex - oldestMessageIndex + 1;
} else {
numberOfMessages = MAX_LOG_MESSAGES;
}
LogMessage[] copy = new LogMessage[numberOfMessages];
for (int i = 0; i < numberOfMessages; i++) {
int index = newestMessageIndex - i;
if (index < 0) {
index = MAX_LOG_MESSAGES + index;
}
copy[numberOfMessages - i - 1] = store[index];
}
return copy;
}
public static synchronized void clear() {
oldestMessageIndex = -1;
newestMessageIndex = -1;
store = new LogMessage[MAX_LOG_MESSAGES];
}
}