/** * Copyright (C) 2013-2016 The Rythm Engine project * for LICENSE and other details see: * https://github.com/rythmengine/rythmengine */ package org.rythmengine.logger; import org.rythmengine.Rythm; import org.rythmengine.extension.ILoggerFactory; import java.util.HashMap; import java.util.Map; /** * Created by IntelliJ IDEA. * User: luog * Date: 19/01/12 * Time: 3:32 PM * To change this template use File | Settings | File Templates. */ public class Logger { private Logger() { } private static class Proxy implements ILogger { private Class<?> c_; private ILogger l_; Proxy(Class<?> clazz) { c_ = clazz; } ILogger impl() { if (null == l_) { l_ = fact.getLogger(c_); } return l_; } @Override public boolean isTraceEnabled() { return impl().isTraceEnabled(); } @Override public void trace(String format, Object... args) { impl().trace(format, args); } @Override public void trace(Throwable t, String format, Object... args) { impl().trace(t, format, args); } @Override public boolean isDebugEnabled() { return impl().isDebugEnabled(); } @Override public void debug(String format, Object... args) { impl().debug(format, args); } @Override public void debug(Throwable t, String format, Object... args) { impl().debug(t, format, args); } @Override public boolean isInfoEnabled() { return impl().isInfoEnabled(); } @Override public void info(String format, Object... arg) { impl().info(format, arg); } @Override public void info(Throwable t, String format, Object... args) { impl().info(t, format, args); } @Override public boolean isWarnEnabled() { return impl().isWarnEnabled(); } @Override public void warn(String format, Object... args) { impl().warn(format, args); } @Override public void warn(Throwable t, String format, Object... args) { impl().warn(t, format, args); } @Override public boolean isErrorEnabled() { return impl().isErrorEnabled(); } @Override public void error(String format, Object... arg) { impl().error(format, arg); } @Override public void error(Throwable t, String format, Object... args) { impl().error(t, format, args); } } private static Map<Class<?>, ILogger> loggers = new HashMap<Class<?>, ILogger>(); private static ILoggerFactory userFact = null; private static final ILoggerFactory fact = new ILoggerFactory() { private ILoggerFactory defFact = new JDKLogger.Factory(); @Override public ILogger getLogger(Class<?> clazz) { return null == userFact ? defFact.getLogger(clazz) : userFact.getLogger(clazz); } }; public static ILogger get(Class<?> clazz) { ILogger logger = loggers.get(clazz); if (null == logger) { logger = new Proxy(clazz); loggers.put(clazz, logger); } return logger; } private static ILogger def = null; private static ILogger def() { if (null == def) def = get(Rythm.class); return def; } public static void registerLoggerFactory(ILoggerFactory fact) { reset(); userFact = fact; } public static void reset() { userFact = null; def = null; loggers.clear(); } public static boolean isTraceEnabled() { return def().isTraceEnabled(); } public static void trace(String format, Object... args) { def().trace(format, args); } public static void trace(Throwable t, String format, Object... args) { def().trace(t, format, args); } public static boolean isDebugEnabled() { return def().isDebugEnabled(); } public static void debug(String format, Object... args) { def().debug(format, args); } public static void debug(Throwable t, String format, Object... args) { def().debug(t, format, args); } public static boolean isInfoEnabled() { return def().isInfoEnabled(); } public static void info(String format, Object... arg) { def().info(format, arg); } public static void info(Throwable t, String format, Object... args) { def().info(t, format, args); } public static boolean isWarnEnabled() { return def().isWarnEnabled(); } public static void warn(String format, Object... arg) { def().warn(format, arg); } public static void warn(Throwable t, String format, Object... args) { def().warn(t, format, args); } public static boolean isErrorEnabled() { return def().isErrorEnabled(); } public static void error(String format, Object... arg) { def().error(format, arg); } public static void error(Throwable t, String format, Object... args) { def().error(t, format, args); } }