001    package org.shiftone.jrat.util.log;
002    
003    
004    import org.shiftone.jrat.core.Environment;
005    import org.shiftone.jrat.core.JRatException;
006    import org.shiftone.jrat.util.Assert;
007    import org.shiftone.jrat.util.log.target.*;
008    
009    import java.io.PrintWriter;
010    
011    
012    /**
013     * There are currently 3 ways that logging can be configured...
014     * <li>turned off - using NullLogTarget
015     * <li>logging to a PrintWriter - System.out or file
016     * <li>using thread based logging - each thread can have it's own LogTarget
017     * (this is for the Desktop)
018     *
019     * @author jeff@shiftone.org (Jeff Drost)
020     */
021    public class LoggerFactory implements Constants {
022    
023        private static final NullLogTarget NULL_LOG_TARGET = NullLogTarget.INSTANCE;
024        private static final WriterLogTarget SYSTEM_OUT_TARGET = new WriterLogTarget(System.out);
025        private static final ProxyLogTarget PROXY_LOG_TARGET = new ProxyLogTarget(SYSTEM_OUT_TARGET);
026        private static final ThreadLocalLogTarget THREAD_TARGET = new ThreadLocalLogTarget(SYSTEM_OUT_TARGET);
027    
028        public static void initialize() {
029    
030            // try {
031            setLevel(getLevelFromName(Environment.getSettings().getLogLevel()));
032    
033            // } catch (Exception e) {}
034        }
035    
036    
037        public static Logger getLogger(Class klass) {
038    
039            String className = klass.getName();
040            String shortName = className.substring(className.lastIndexOf('.') + 1);
041    
042            return getLogger(shortName);
043        }
044    
045    
046        public static Logger getLogger(String topic) {
047            return new Logger(topic, PROXY_LOG_TARGET);
048        }
049    
050    
051        public static int getLevelFromName(String levelName) {
052    
053            Assert.assertNotNull("levelName", levelName);
054            Assert.assertNotNull("LEVEL_NAMES", LEVEL_NAMES);
055    
056            levelName = levelName.toUpperCase();
057    
058            for (int i = 0; i < LEVEL_NAMES.length; i++) {
059                if (levelName.equals(LEVEL_NAMES[i])) {
060                    return i;
061                }
062            }
063    
064            throw new JRatException("log level '" + levelName + "' is not known");
065        }
066    
067    
068        public static void setLevel(int level) {
069            PROXY_LOG_TARGET.setCurrentLevel(level);
070        }
071    
072    
073        public static int getLevel() {
074            return PROXY_LOG_TARGET.getCurrentLevel();
075        }
076    
077    
078        public static void disableLogging() {
079            setLogTarget(NULL_LOG_TARGET);
080        }
081    
082    
083        public static void enableThreadBasedLogging() {
084            setLogTarget(THREAD_TARGET);
085        }
086    
087    
088        public static void enableSystemOutLogging() {
089            setLogTarget(SYSTEM_OUT_TARGET);
090        }
091    
092        public static synchronized void setLogTarget(LogTarget logTarget) {
093            PROXY_LOG_TARGET.setLogTarget(logTarget);
094        }
095    
096        public static synchronized LogTarget getLogTarget() {
097            return PROXY_LOG_TARGET.getLogTarget();
098        }
099    
100        public static void redirectLogging(PrintWriter printWriter) {
101    
102            TandemTarget tandemTarget = new TandemTarget(SYSTEM_OUT_TARGET, new WriterLogTarget(printWriter));
103    
104            setLogTarget(tandemTarget);
105        }
106    
107    
108        /**
109         * this will only have any effect on logging if the current mode is using
110         * the ThreadLocalLogTarget - meaning a call to enableDesktopLoggingMode was
111         * made.
112         */
113        public static void executeInThreadScope(LogTarget newTarget, Runnable runnable) {
114            THREAD_TARGET.executeInScope(newTarget, runnable);
115        }
116    }