root/sandbox/trunk/AdaBoost/src/org/xerial/util/log/Logger.java

Revision 2213, 7.1 kB (checked in by leo, 4 years ago)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Date Rev LastChangedBy URL Author
Line 
1/*--------------------------------------------------------------------------
2 *  Copyright 2007 Taro L. Saito
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License");
5 *  you may not use this file except in compliance with the License.
6 *  You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 *--------------------------------------------------------------------------*/
16//--------------------------------------
17// AdaBoost Project
18//
19// Logger.java
20// Since: Jul 9, 2007
21//
22// $URL$
23// $Author$
24//--------------------------------------
25package org.xerial.util.log;
26
27import java.io.BufferedInputStream;
28import java.io.FileInputStream;
29import java.io.IOException;
30import java.io.OutputStreamWriter;
31import java.io.Writer;
32import java.util.HashMap;
33import java.util.Properties;
34
35public class Logger
36{
37    public static enum LogLevel {
38        ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF, UNSPECIFIED
39    };
40
41    private static String[] logPrefix = { "", // ALL
42            "\033[0;32m", // TRACE
43            "", // DEBUG
44            "\033[1;36m", // INFO
45            "\033[1;33m", // WARN
46            "\033[1;35m", // ERROR
47            "\033[1;31m", // FATAL
48            "", // OFF
49            "", };
50
51    private Writer _out = null;
52    private LogLevel _threshold = LogLevel.UNSPECIFIED;
53    private String _loggerFullName = "";
54    private String _loggerShortName = "";
55    private Logger _parentLogger = null;
56
57    private static HashMap<String, Logger> _loggerHolder = new HashMap<String, Logger>();
58    private static Logger _rootLogger = new Logger();
59
60    static
61    {
62        _rootLogger.setLogLevel(LogLevel.INFO);
63        _rootLogger.setOutputWriter(new OutputStreamWriter(System.out));
64        _rootLogger._loggerFullName = "root";
65        _rootLogger._loggerShortName = "root";
66
67        String loggerConfigFile = System.getProperty("log.config");
68        if (loggerConfigFile != null)
69        {
70            try
71            {
72                Logger.configure(loggerConfigFile);
73            }
74            catch (IOException e)
75            {
76                e.printStackTrace();
77            }
78        }
79    }
80
81    /**
82     * Non constractable
83     */
84    private Logger()
85    {
86
87    }
88
89    private Logger(String fullTypeName)
90    {
91        _loggerFullName = fullTypeName;
92        String[] packageList = _loggerFullName.split("\\.");
93        _loggerShortName = packageList[packageList.length - 1];
94        if (packageList.length == 1)
95            _parentLogger = _rootLogger;
96        else
97        {
98            String parentPackageName = concatinate(packageList, packageList.length - 1);
99            _parentLogger = getLogger(parentPackageName);
100        }
101    }
102
103    private String concatinate(String[] packageList, int upTo)
104    {
105        StringBuilder builder = new StringBuilder();
106        for (int i = 0; i < upTo - 1; i++)
107        {
108            builder.append(packageList[i]);
109            builder.append(".");
110        }
111        builder.append(packageList[upTo - 1]);
112        return builder.toString();
113    }
114
115    @SuppressWarnings("unchecked")
116    public static Logger getLogger(Class c)
117    {
118        return getLogger(c.getName());
119    }
120
121    public static Logger getLogger(Package p)
122    {
123        return getLogger(p.getName());
124    }
125
126    public static synchronized Logger getLogger(String fullTypeName)
127    {
128        if (fullTypeName == null)
129            return _rootLogger;
130
131        if (_loggerHolder.containsKey(fullTypeName))
132            return _loggerHolder.get(fullTypeName);
133        else
134        {
135            Logger newLogger = new Logger(fullTypeName);
136            _loggerHolder.put(fullTypeName, newLogger);
137            return newLogger;
138        }
139    }
140
141    public static Logger getRootLogger()
142    {
143        return _rootLogger;
144    }
145
146    public static void configure(String configFile) throws IOException
147    {
148        Properties configProperties = new Properties();
149        BufferedInputStream reader = new BufferedInputStream(new FileInputStream(configFile));
150        configProperties.load(reader);
151
152        for (Object key : configProperties.keySet())
153        {
154            String loggerName = key.toString();
155            String logLevel = configProperties.getProperty(loggerName);
156            Logger logger = getLogger(loggerName);
157            logger.setLogLevel(logLevel);
158        }
159    }
160
161    public String getLoggerName()
162    {
163        return _loggerFullName;
164    }
165
166    public void setLogLevel(LogLevel logLevel)
167    {
168        this._threshold = logLevel;
169    }
170
171    public void setLogLevel(String logLevel)
172    {
173        for (LogLevel l : LogLevel.values())
174        {
175            if (l.name().toLowerCase().equals(logLevel.toLowerCase()))
176            {
177                setLogLevel(l);
178                return;
179            }
180        }
181
182        throw new IllegalArgumentException("unknown log level: " + logLevel);
183    }
184
185    public LogLevel getLogLevel()
186    {
187        return _threshold;
188    }
189
190    public void setOutputWriter(Writer writer)
191    {
192        this._out = writer;
193    }
194
195    public void trace(Object message)
196    {
197        log(LogLevel.TRACE, message);
198    }
199
200    public void debug(Object message)
201    {
202        log(LogLevel.DEBUG, message);
203    }
204
205    public void info(Object message)
206    {
207        log(LogLevel.INFO, message);
208    }
209
210    public void warn(Object message)
211    {
212        log(LogLevel.WARN, message);
213    }
214
215    public void error(Object message)
216    {
217        log(LogLevel.ERROR, message);
218    }
219
220    public void fatal(Object message)
221    {
222        log(LogLevel.FATAL, message);
223    }
224
225    public boolean isEnabled(LogLevel logLevel)
226    {
227        if (_threshold == LogLevel.UNSPECIFIED)
228        {
229            if (_parentLogger != null)
230                return _parentLogger.isEnabled(logLevel);
231            else
232                return false;
233        }
234        return _threshold.ordinal() <= logLevel.ordinal();
235    }
236
237    private Writer getWriter()
238    {
239        if (_out != null)
240            return _out;
241        else
242        {
243            if (_parentLogger != null)
244                return _parentLogger.getWriter();
245            else
246                return null;
247        }
248    }
249
250    private void log(LogLevel logLevel, Object message)
251    {
252        if (!isEnabled(logLevel))
253            return;
254
255        Writer logOut = getWriter();
256        if (logOut == null)
257            return; // no output is specified
258
259        try
260        {
261            logOut.write("[" + _loggerShortName + "]\t");
262            //logOut.write(String.format("%5s", logLevel.toString()));
263            //logOut.write(" [");
264            //logOut.write(_loggerShortName);
265            //logOut.write("]\t");
266            if (message != null)
267                logOut.write(message.toString());
268            //logOut.write("\033[0m");
269            logOut.write("\n");
270            logOut.flush();
271        }
272        catch (IOException e)
273        {
274            e.printStackTrace();
275        }
276    }
277}
Note: See TracBrowser for help on using the browser.