astrXbian/.install/.kodi/addons/script.module.xbmcswift2/lib/xbmcswift2/logger.py

100 lines
2.9 KiB
Python

'''
xbmcswift2.log
--------------
This module contains the xbmcswift2 logger as well as a convenience
method for creating new loggers.
:copyright: (c) 2012 by Jonathan Beluch
:license: GPLv3, see LICENSE for more details.
'''
import logging
from xbmcswift2 import CLI_MODE
# TODO: Add logging to a file as well when on CLI with lowest threshold
# possible
#fh = logging.FileHandler('log_filename.txt')
#fh.setLevel(logging.DEBUG)
#fh.setFormatter(formatter)
#log.addHandler(fh)
# TODO: Allow a global flag to set logging level when dealing with XBMC
# TODO: Add -q and -v flags to CLI to quiet or enabel more verbose logging
class XBMCFilter(object):
'''A logging filter that streams to STDOUT or to the xbmc log if
running inside XBMC.
'''
python_to_xbmc = {
'DEBUG': 'LOGDEBUG',
'INFO': 'LOGNOTICE',
'WARNING': 'LOGWARNING',
'ERROR': 'LOGERROR',
'CRITICAL': 'LOGSEVERE',
}
xbmc_levels = {
'LOGDEBUG': 0,
'LOGINFO': 1,
'LOGNOTICE': 2,
'LOGWARNING': 3,
'LOGERROR': 4,
'LOGSEVERE': 5,
'LOGFATAL': 6,
'LOGNONE': 7,
}
def __init__(self, prefix):
self.prefix = prefix
def filter(self, record):
'''Returns True for all records if running in the CLI, else returns
True.
When running inside KODI it calls the xbmc.log() method and prevents
the message from being double printed to STDOUT.
'''
# When running in KODI, any logged statements will be double printed
# since we are calling xbmc.log() explicitly. Therefore we return False
# so every log message is filtered out and not printed again.
if CLI_MODE:
return True
else:
# Must not be imported until here because of import order issues
# when running in CLI
from xbmcswift2 import xbmc
xbmc_level = XBMCFilter.xbmc_levels.get(
XBMCFilter.python_to_xbmc.get(record.levelname))
xbmc.log('%s%s' % (self.prefix, record.getMessage()), xbmc_level)
return False
if CLI_MODE:
GLOBAL_LOG_LEVEL = logging.INFO
else:
GLOBAL_LOG_LEVEL = logging.DEBUG
def setup_log(name):
'''Returns a logging instance for the provided name. The returned
object is an instance of logging.Logger. Logged messages will be
printed to stderr when running in the CLI, or forwarded to KODI's
log when running in KODI mode.
'''
_log = logging.getLogger(name)
_log.setLevel(GLOBAL_LOG_LEVEL)
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - [%(name)s] %(message)s')
handler.setFormatter(formatter)
_log.addHandler(handler)
_log.addFilter(XBMCFilter('[%s] ' % name))
return _log
# The xbmcswift2 log
# Plugin writers should use plugin.log instead.
log = setup_log('xbmcswift2')