package nginx.clojure.logger;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import nginx.clojure.NginxClojureRT;
/**
* This tiny log service is mainly for debug use
*/
public class TinyLogService implements LoggerService {
public static final String NGINX_CLOJURE_LOG_LEVEL = "nginx.clojure.logger.level";
public enum MsgType{ trace, debug,info, warn, error, fatal };
public static final Set<String> LOG_METHODS = new HashSet<String>();
static {
for (MsgType t : MsgType.values()) {
LOG_METHODS.add(t.name());
}
}
protected MsgType level = MsgType.info;
protected PrintStream out;
protected PrintStream err;
protected boolean showMethod = false;
public static TinyLogService createDefaultTinyLogService() {
return new TinyLogService(TinyLogService.getSystemPropertyOrDefaultLevel(), System.err, System.err);
}
public static MsgType getSystemPropertyOrDefaultLevel(String p, MsgType t) {
String l = System.getProperty(p);
if (l != null){
try{
return MsgType.valueOf(l);
}catch (Exception e) {
e.printStackTrace();
}
}
return t == null ? MsgType.info : t;
}
public static MsgType getSystemPropertyOrDefaultLevel() {
String l = System.getProperty(NGINX_CLOJURE_LOG_LEVEL);
if (l != null){
try{
return MsgType.valueOf(l);
}catch (Exception e) {
e.printStackTrace();
}
}
return MsgType.info;
}
public TinyLogService(){
String l = System.getProperty(NGINX_CLOJURE_LOG_LEVEL);
if (l != null){
try{
level = MsgType.valueOf(l);
}catch (Exception e) {
e.printStackTrace();
}
}
out = System.out;
err = System.err;
}
public TinyLogService(MsgType level, PrintStream out, PrintStream err) {
this.level = level;
this.out = out;
this.err = err;
}
public void debug(Object message) {
if (message instanceof Throwable) {
((Throwable)message).printStackTrace(message(((Throwable)message).getMessage(), MsgType.debug));
}else {
message(message, MsgType.debug);
}
}
public void debug(Object message, Throwable t) {
if (isDebugEnabled()){
t.printStackTrace(message(message, MsgType.debug));
}
}
public void debug(String format, Object ... objects){
message(format, MsgType.debug, objects);
}
public void error(Object message) {
if (message instanceof Throwable) {
((Throwable)message).printStackTrace(message(((Throwable)message).getMessage(), MsgType.error));
}else {
message(message, MsgType.error);
}
}
public void error(Object message, Throwable t) {
t.printStackTrace(message(message, MsgType.error));
}
public void error(String format, Object ... objects){
message(format, MsgType.error, objects);
}
public void fatal(Object message) {
if (message instanceof Throwable) {
((Throwable)message).printStackTrace(message(((Throwable)message).getMessage(), MsgType.fatal));
}else {
message(message, MsgType.fatal);
}
}
public void fatal(Object message, Throwable t) {
t.printStackTrace(message(message, MsgType.fatal));
}
public void fatal(String format, Object ... objects){
message(format, MsgType.fatal, objects);
}
public PrintStream message(String format, MsgType type, Object ...objects){
if (type.compareTo(level) < 0){
return out;
}
return message(String.format(format, objects), type);
}
public PrintStream message(Object message, MsgType type){
if (type.compareTo(level) < 0){
return this.out;
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuffer s = new StringBuffer();
s.append(sf.format(new Date())).append("[").append(type).append("]");
s.append("[").append(NginxClojureRT.processId).append("]");
if (type.compareTo(MsgType.debug) >= 0) {
s.append("[").append(Thread.currentThread().getName()).append("]");
}
if (showMethod) {
StackTraceElement se = null;
boolean meetCurrentMethod = false;
for (StackTraceElement si : Thread.currentThread().getStackTrace()){
if (si.getClassName().equals(TinyLogService.class.getName()) || LOG_METHODS.contains(si.getMethodName())){
meetCurrentMethod = true;
continue;
}
if (meetCurrentMethod){
se = si;
break;
}
}
s.append("[").append(se.getClassName()).append(".").append(se.getMethodName()).append("]:");
}
s.append(message);
PrintStream out = this.out;
if (type != MsgType.debug && type != MsgType.info){
out = this.err;
}
out.println(s);
return out;
}
public void info(Object message) {
if (message instanceof Throwable) {
((Throwable)message).printStackTrace(message(((Throwable)message).getMessage(), MsgType.info));
}else {
message(message, MsgType.info);
}
}
public void info(Object message, Throwable t) {
message(message, MsgType.info);
t.printStackTrace(out);
}
public void info(String format, Object ... objects){
message(format, MsgType.info, objects);
}
public boolean isDebugEnabled() {
return level.compareTo(MsgType.debug) <= 0;
}
public boolean isErrorEnabled() {
return level.compareTo(MsgType.error) <= 0;
}
public boolean isFatalEnabled() {
return level.compareTo(MsgType.fatal) <= 0;
}
public boolean isInfoEnabled() {
return level.compareTo(MsgType.info) <= 0;
}
public boolean isTraceEnabled() {
return level.compareTo(MsgType.trace) <= 0;
}
public boolean isWarnEnabled() {
return level.compareTo(MsgType.warn) <= 0;
}
public void trace(Object message) {
message(message, MsgType.trace);
}
public void trace(Object message, Throwable t) {
t.printStackTrace(message(message, MsgType.trace));
}
public void trace(String format, Object ... objects){
message(format, MsgType.trace, objects);
}
public void warn(Object message) {
if (message instanceof Throwable) {
((Throwable)message).printStackTrace(message(((Throwable)message).getMessage(), MsgType.warn));
}else {
message(message, MsgType.warn);
}
}
public void warn(Object message, Throwable t) {
t.printStackTrace(message(message, MsgType.warn));
}
public void warn(String format, Object ... objects){
message(format, MsgType.warn, objects);
}
public MsgType getLevel() {
return level;
}
public void setLevel(MsgType level) {
this.level = level;
}
public PrintStream getOut() {
return out;
}
public void setOut(PrintStream out) {
this.out = out;
}
public PrintStream getErr() {
return err;
}
public void setErr(PrintStream err) {
this.err = err;
}
public void setShowMethod(boolean showMethod) {
this.showMethod = showMethod;
}
public boolean isShowMethod() {
return showMethod;
}
}