+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2007 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ Project\r
-//\r
-// Logger.java\r
-// Since: Jul 9, 2007\r
-//\r
-// $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/log/Logger.java $ \r
-// $Author: leo $\r
-//--------------------------------------\r
-package org.xerial.util.log;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.ByteArrayInputStream;\r
-import java.io.FileReader;\r
-import java.io.IOException;\r
-import java.io.Reader;\r
-import java.util.Properties;\r
-import java.util.TreeMap;\r
-\r
-/**\r
- * Logger\r
- * \r
- * @author leo\r
- * \r
- */\r
-public class Logger {\r
-\r
- private LogWriter writer = null;\r
- private LogLevel _threshold = LogLevel.UNSPECIFIED;\r
- private String _loggerFullName = "";\r
- private String _loggerShortName = "";\r
- private Logger _parentLogger = null;\r
- private boolean _emitEscapeSequence = false;\r
-\r
- private static TreeMap<String, Logger> _loggerHolder = new TreeMap<String, Logger>();\r
- private static Logger _rootLogger = new Logger();\r
-\r
- static {\r
- _rootLogger.setLogLevel(LogLevel.INFO);\r
- _rootLogger.setLogWriter(new SimpleLogWriter());\r
-\r
- _rootLogger._loggerFullName = "root";\r
- _rootLogger._loggerShortName = "root";\r
-\r
- String logLevel = System.getProperty("xerial.loglevel");\r
- if (logLevel != null) {\r
- _rootLogger.setLogLevel(logLevel);\r
- }\r
- else {\r
- logLevel = System.getProperty("loglevel");\r
- if (logLevel != null) {\r
- _rootLogger.setLogLevel(logLevel);\r
- }\r
- }\r
-\r
- String useColor = System.getProperty("log.color");\r
- if (useColor != null)\r
- _rootLogger._emitEscapeSequence = Boolean.parseBoolean(useColor);\r
-\r
- String loggerConfigFile = System.getProperty("log.config");\r
- if (loggerConfigFile != null) {\r
- try {\r
- Logger.configure(loggerConfigFile);\r
- }\r
- catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
-\r
- }\r
-\r
- /**\r
- * hide constructor\r
- */\r
- private Logger() {\r
-\r
- }\r
-\r
- private Logger(String fullTypeName) {\r
- _loggerFullName = fullTypeName;\r
- String[] packageList = _loggerFullName.split("\\.");\r
- _loggerShortName = packageList[packageList.length - 1];\r
- if (packageList.length == 1)\r
- _parentLogger = _rootLogger;\r
- else {\r
- String parentPackageName = concatinate(packageList, packageList.length - 1);\r
- _parentLogger = getLogger(parentPackageName);\r
- }\r
- }\r
-\r
- private String concatinate(String[] packageList, int upTo) {\r
- StringBuilder builder = new StringBuilder();\r
- for (int i = 0; i < upTo - 1; i++) {\r
- builder.append(packageList[i]);\r
- builder.append(".");\r
- }\r
- builder.append(packageList[upTo - 1]);\r
- return builder.toString();\r
- }\r
-\r
- public static Logger getLogger(Class< ? > c) {\r
- return getLogger(c.getName());\r
- }\r
-\r
- public static Logger getLogger(Class< ? > c, String suffix) {\r
- if (suffix == null || suffix.length() <= 0)\r
- return getLogger(c);\r
- else\r
- return getLogger(String.format("%s-%s", c.getName(), suffix));\r
- }\r
-\r
- public static Logger getLogger(Package p) {\r
- return getLogger(p.getName());\r
- }\r
-\r
- public static synchronized Logger getLogger(String fullTypeName) {\r
- if (fullTypeName == null)\r
- return _rootLogger;\r
-\r
- if (_loggerHolder.containsKey(fullTypeName))\r
- return _loggerHolder.get(fullTypeName);\r
- else {\r
- Logger newLogger = new Logger(fullTypeName);\r
- _loggerHolder.put(fullTypeName, newLogger);\r
- newLogger._emitEscapeSequence = _rootLogger._emitEscapeSequence;\r
- return newLogger;\r
- }\r
- }\r
-\r
- public static Logger getRootLogger() {\r
- return _rootLogger;\r
- }\r
-\r
- public static void configure(String configFile) throws IOException {\r
- configure(new BufferedReader(new FileReader(configFile)));\r
- }\r
-\r
- public static void configure(Reader configurationFileReader) throws IOException {\r
- Properties configProperties = new Properties();\r
-\r
- StringBuilder sb = new StringBuilder();\r
- int ch;\r
- while ((ch = configurationFileReader.read()) > 0) {\r
- sb.append((char) ch);\r
- }\r
- ByteArrayInputStream bs = new ByteArrayInputStream(sb.toString().getBytes());\r
- configProperties.load(bs);\r
-\r
- for (Object key : configProperties.keySet()) {\r
- String[] lhs = ((String) key).split("#");\r
- String loggerName = lhs[0];\r
- String value = configProperties.getProperty(key.toString());\r
- Logger logger = getLogger(loggerName);\r
- if (lhs.length <= 1) {\r
- logger.setLogLevel(value);\r
- }\r
- else if (lhs.length > 1) {\r
- // packageName:parameter = value configuration\r
- String parameter = lhs[1];\r
- if (parameter.equals("color")) {\r
- logger.enableColor(Boolean.parseBoolean(value));\r
- }\r
- else {\r
- System.err.println("unknown configuration parameter: " + parameter);\r
- }\r
- }\r
- else {\r
- System.err.println("Error in the logger configuration file: " + key);\r
- }\r
- }\r
- }\r
-\r
- public String getLoggerName() {\r
- return _loggerFullName;\r
- }\r
-\r
- public String getLoggerShortName() {\r
- return _loggerShortName;\r
- }\r
-\r
- public void setLogLevel(LogLevel logLevel) {\r
- this._threshold = logLevel;\r
- }\r
-\r
- public void setLogLevel(String logLevel) {\r
- for (LogLevel l : LogLevel.values()) {\r
- if (l.name().equalsIgnoreCase(logLevel)) {\r
- setLogLevel(l);\r
- return;\r
- }\r
- }\r
-\r
- warn("unknown log level: " + logLevel);\r
- }\r
-\r
- public LogLevel getLogLevel() {\r
- return _threshold;\r
- }\r
-\r
- public void setLogWriter(LogWriter writer) {\r
- if (writer == null)\r
- throw new NullPointerException();\r
-\r
- this.writer = writer;\r
- }\r
-\r
- public boolean trace(Object message) {\r
- log(LogLevel.TRACE, message);\r
- return true;\r
- }\r
-\r
- public boolean debug(Object message) {\r
- log(LogLevel.DEBUG, message);\r
- return true;\r
- }\r
-\r
- public boolean info(Object message) {\r
- log(LogLevel.INFO, message);\r
- return true;\r
- }\r
-\r
- public boolean warn(Object message) {\r
- log(LogLevel.WARN, message);\r
- return true;\r
- }\r
-\r
- public boolean error(Object message) {\r
- log(LogLevel.ERROR, message);\r
- return true;\r
- }\r
-\r
- public boolean fatal(Object message) {\r
- log(LogLevel.FATAL, message);\r
- return true;\r
- }\r
-\r
- /**\r
- * Use colored console outputs using escape sequences\r
- * \r
- * @param enable\r
- * @return\r
- */\r
- public void enableColor(boolean enable) {\r
- _emitEscapeSequence = enable;\r
- }\r
-\r
- /**\r
- * @return true when escape sequence is used to output the log\r
- */\r
- public boolean isColorEnabled() {\r
- return _emitEscapeSequence;\r
- }\r
-\r
- public boolean isDebugEnabled() {\r
- return isEnabled(LogLevel.DEBUG);\r
- }\r
-\r
- public boolean isTraceEnabled() {\r
- return isEnabled(LogLevel.TRACE);\r
- }\r
-\r
- public boolean isInfoEnabled() {\r
- return isEnabled(LogLevel.INFO);\r
- }\r
-\r
- public boolean isWarnEnabled() {\r
- return isEnabled(LogLevel.WARN);\r
- }\r
-\r
- public boolean isErrorEnabled() {\r
- return isEnabled(LogLevel.ERROR);\r
- }\r
-\r
- public boolean isFatalEnalbed() {\r
- return isEnabled(LogLevel.FATAL);\r
- }\r
-\r
- public boolean isEnabled(LogLevel logLevel) {\r
- if (_threshold == LogLevel.UNSPECIFIED) {\r
- Logger parent = this;\r
- while ((parent = parent._parentLogger) != null) {\r
- if (parent.getLogLevel() == LogLevel.UNSPECIFIED)\r
- continue;\r
-\r
- _threshold = parent.getLogLevel();\r
- break;\r
- }\r
- if (_threshold == LogLevel.UNSPECIFIED)\r
- return false;\r
- }\r
- return _threshold.ordinal() <= logLevel.ordinal();\r
- }\r
-\r
- private LogWriter getLogWriter() {\r
- if (writer != null)\r
- return writer;\r
- else {\r
- if (_parentLogger != null)\r
- return _parentLogger.getLogWriter();\r
- else\r
- return null;\r
- }\r
- }\r
-\r
- private void log(LogLevel logLevel, Object message) {\r
- if (!isEnabled(logLevel))\r
- return;\r
-\r
- LogWriter logOut = getLogWriter();\r
- if (logOut == null)\r
- return; // no output is specified\r
-\r
- try {\r
- logOut.log(this, logLevel, message);\r
- }\r
- catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
-}\r