Source code for

# Copyright (C) 2012-2014 Peter Hatina <>
# 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 2
# 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
# 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 <>.

import logging
import sys

from import LMIShellOptions

[docs]class LMIShellLogger(logging.Logger): """ LMIShell's logger with queueing capability. """ def __init__(self, name, level=logging.NOTSET): # Due to Python2.6 compatibility, we call superclass c-tor in this way. logging.Logger.__init__(self, name, level) self.queue = [] def _log(self, level, msg, args, exc_info=None, extra=None): if logging._srcfile: try: fn, lno, func = self.findCaller() except ValueError: fn, lno, func = "(unknown file)", 0, "(unknown function)" else: fn, lno, func = "(unknown file)", 0, "(unknown function)" if exc_info: if not isinstance(exc_info, tuple): exc_info = sys.exc_info() record = self.makeRecord(, level, fn, lno, msg, args, exc_info, func, extra) if self.isEnabledFor(level): self.handle(record) else: self.queue.append(record)
[docs] def setLevel(self, level): """ Sets a logging level of this handler. If there are any log records stored in internal queue, they are also handled. :param int level: logging level """ logging.Logger.setLevel(self, level) self.processQueue()
[docs] def processQueue(self): """ Logs all enabled log records stored in internal queue. """ # Handle all enabled log records. for r in self.queue: if not self.isEnabledFor(r.levelno): continue self.handle(r) # Remove all handled records. self.queue = filter( lambda r: not self.isEnabledFor(r.levelno), self.queue)
[docs] def debug(self, msg, *args, **kwargs): """ Log a message with severity 'DEBUG'. """ self._log(logging.DEBUG, msg, args, **kwargs)
[docs] def critical(self, msg, *args, **kwargs): """ Log a message with severity 'CRITICAL'. """ self._log(logging.CRITICAL, msg, args, **kwargs)
[docs] def error(self, msg, *args, **kwargs): """ Log a message with severity 'ERROR'. """ self._log(logging.ERROR, msg, args, **kwargs)
[docs] def exception(self, msg, *args, **kwargs): """ Log a message with severity 'ERROR' also with exception information. """ kwargs["exc_info"] = 1 self.error(msg, args, **kwargs)
[docs] def info(self, msg, *args, **kwargs): """ Log a message with severity 'INFO'. """ self._log(logging.INFO, msg, args, **kwargs)
[docs] def warning(self, msg, *args, **kwargs): """ Log a message with severity 'WARNING'. """ self._log(logging.WARNING, msg, args, **kwargs)
[docs]def lmi_init_logger(): """ Initializes LMIShell's logging. """ logging.basicConfig(format='%(levelname)s: %(message)s')
[docs]def lmi_get_logger(): """ Returns LMIShell's logger. :returns: logger """ return logging.getLogger("lmishell")
[docs]def lmi_setup_logger(log_options): """ Sets logging level. :param int log_options: level defined in :py:class:`.LMIShellOptions` """ logger = lmi_get_logger() if log_options == LMIShellOptions._LOG_MORE_VERBOSE: # Print out all the log messages to stderr stream logger.setLevel(logging.DEBUG) elif log_options == LMIShellOptions._LOG_VERBOSE: # Print out only a set of log messages to stderr stream logger.setLevel(logging.INFO) elif log_options == LMIShellOptions._LOG_QUIET: # Quiet flag seen, drop all the log messages handlers = logger.handlers for handler in handlers: logger.removeHandler(handler) logger.addHandler(logging.NullHandler()) else: # By default, print error messages to stderr stream logger.setLevel(logging.ERROR)