Source code for medpy.core.logger

# Copyright (C) 2013 Oskar Maier
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# author Oskar Maier
# version r0.1
# since 2011-12-12
# status Release

# build-in module
import sys
import logging
from logging import Logger as NativeLogger

# third-party modules

# own modules

# constants

# code
[docs]class Logger (NativeLogger): r"""Logger to be used by all applications and classes. Notes ----- Singleton class i.e. setting the log level changes the output globally. Examples -------- Initializing the logger >>> from medpy.core import Logger >>> logger = Logger.getInstance() Error messages are passed to stdout >>> logger.error('error message') 15.09.2014 12:40:25 [ERROR ] error message >>> logger.error('critical message') 15.09.2014 12:40:42 [CRITICAL] critical message But debug and info messages are suppressed >>> logger.info('info message') >>> logger.debug('debug message') Unless the log level is set accordingly >>> import logging >>> logger.setLevel(logging.DEBUG) >>> logger.info('info message') 15.09.2014 12:43:06 [INFO ] info message (in <ipython-input-14-a08cad56519d>.<module>:1) >>> logger.debug('debug message') 15.09.2014 12:42:50 [DEBUG ] debug message (in <ipython-input-13-3bb0c512b560>.<module>:1) """ class LoggerHelper (object): r"""A helper class which performs the actual initialization. """ def __call__(self, *args, **kw) : # If an instance of TestSingleton does not exist, # create one and assign it to TestSingleton.instance. if Logger._instance is None : Logger._instance = Logger() # Return TestSingleton.instance, which should contain # a reference to the only instance of TestSingleton # in the system. return Logger._instance r"""Member variable initiating and returning the instance of the class.""" getInstance = LoggerHelper() r"""The member variable holding the actual instance of the class.""" _instance = None r"""Holds the loggers handler for format changes.""" _handler = None
[docs] def __init__(self, name = 'MedPyLogger', level = 0) : # To guarantee that no one created more than one instance of Logger: if not Logger._instance == None : raise RuntimeError('Only one instance of Logger is allowed!') # initialize parent NativeLogger.__init__(self, name, level) # set attributes self.setHandler(logging.StreamHandler(sys.stdout)) self.setLevel(logging.WARNING)
[docs] def setHandler(self, hdlr): r"""Replace the current handler with a new one. Parameters ---------- hdlr : logging.Handler A subclass of Handler that should used to handle the logging output. Notes ----- If none should be replaces, but just one added, use the parent classes addHandler() method. """ if None != self._handler: self.removeHandler(self._handler) self._handler = hdlr self.addHandler(self._handler)
[docs] def setLevel(self, level): r"""Overrides the parent method to adapt the formatting string to the level. Parameters ---------- level : int The new log level to set. See the logging levels in the logging module for details. Examples -------- >>> import logging >>> Logger.setLevel(logging.DEBUG) """ if logging.DEBUG >= level: formatter = logging.Formatter("%(asctime)s [%(levelname)-8s] %(message)s (in %(module)s.%(funcName)s:%(lineno)s)", "%d.%m.%Y %H:%M:%S") self._handler.setFormatter(formatter) else: formatter = logging.Formatter("%(asctime)s [%(levelname)-8s] %(message)s", "%d.%m.%Y %H:%M:%S") self._handler.setFormatter(formatter) NativeLogger.setLevel(self, level)