123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- # -*- coding: utf-8 -*-
- """
- kodiswift.log
- --------------
-
- This module contains the kodiswift logger as well as a convenience
- method for creating new loggers.
-
- :copyright: (c) 2012 by Jonathan Beluch
- :license: GPLv3, see LICENSE for more details.
- """
- from __future__ import absolute_import
-
- import logging
-
- from kodiswift import CLI_MODE
-
- __all__ = ['setup_log', 'GLOBAL_LOG_LEVEL', 'log']
-
- # 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 Kodi
- # TODO: Add -q and -v flags to CLI to quiet or enable more verbose logging
-
-
- class XBMCFilter(object):
- """A logging filter that streams to STDOUT or to the xbmc log if
- running inside Kodi.
- """
- 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 kodiswift 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 kodiswift log
- # Plugin writers should use plugin.log instead.
- log = setup_log('kodiswift')
|