Source code for easydev.logging_tools
# -*- python -*-
#
# This file is part of easydev software
#
# Copyright (c) 2012-2014
#
# File author(s): Thomas Cokelaer <cokelaer@gmail.com>
#
# Distributed under the GPLv3 License.
# See accompanying file LICENSE.txt or copy at
# http://www.gnu.org/licenses/gpl-3.0.html
#
# Website: https://github.com/cokelaer/easydev
#
##############################################################################
import logging
__all__ = ["Logging"]
[docs]class Logging(object):
"""logging utility.
When using the logging utility, it works like a singleton.
So, once logging level is set, you cannot set it again easily.
Here is a class that allows to do that.
.. warning:: this is a bit of a hack. Maybe this is not a proper solution but
it seems to do the job.
::
>>> l = Logging("INFO")
>>> l.info("test")
INFO:root:test
>>> l.level = "WARNING"
>>> l.info("test")
"""
# I think that we can not inherit from logging.
def __init__(self, level):
""".. rubric:: constructor
:param str level: valid levels are ["INFO", "DEBUG", "WARNING",
"CRITICAL", "ERROR"]. If set to True, level is internally set to
INFO. If set to False, level is seet internally to ERROR.
"""
self._debugLevel = None
self.debugLevel = level
self.logging = logging
self.info = logging.info
self.warning = logging.warning
self.critical = logging.critical
self.error = logging.error
self.debug = logging.debug
def _set_level(self, level):
valid_level = [True, False, "INFO", "DEBUG", "WARNING", "CRITICAL", "ERROR"]
if level is True:
level = "INFO"
if level is False:
level = "ERROR"
if level in valid_level:
self._debugLevel = level
else:
raise ValueError("The level of debugging must be in %s " %valid_level)
# I'm not sure this is the best solution, but basicConfig can be called
# only once and populatse root.handlers list with one instance of
# logging.StreamHandler. So, I reset it before calling basicConfig
# that it is effectively changing the logginh behaviour
logging.root.handlers = []
logging.basicConfig(level=self._debugLevel)
def _get_level(self):
return self._debugLevel
debugLevel = property(_get_level, _set_level,
doc="Read/Write access to the debug level. Must be one of INFO, DEBUG, WARNING, CRITICAL, ERROR")
level = property(_get_level, _set_level,
doc="alias to :attr:`~easydev.logging_tools.Logging.debugLevel` (Read-only access)")
# Used copy/deepcopy module
def __copy__(self):
print("WARNING: easydev.logging_tools.__copy__ deprecated. use copy() instead")
s = Logging(self.level)
return s
def __deepcopy__(self, memo):
s = Logging(self.level)
return s