Source code for x2go.log

# -*- coding: utf-8 -*-

# Copyright (C) 2010-2020 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
#
# Python X2Go is free software; you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Python X2Go 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program; if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.

"""\
X2GoLogger class - flexible handling of log and debug output.

"""
__NAME__ = 'x2gologger-pylib'

__package__ = 'x2go'
__name__    = 'x2go.log'

# modules
import os
import sys
import types

loglevel_NONE = 0
loglevel_ERROR = 8
loglevel_WARN = 16
loglevel_NOTICE = 32
loglevel_INFO = 64
loglevel_DEBUG = 128
loglevel_DEBUG_SFTPXFER = 1024

loglevel_DEFAULT = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE
"""\
Default loglevel of X2GoLogger objects is: NOTICE | WARN | ERROR
"""

# Python X2Go modules
from . import utils

[docs]class X2GoLogger(object): """\ A simple logger class, that is used by all Python X2Go classes. """ name = '' tag = '' progpid = -1 level = -1 destination = sys.stderr _loglevel_NAMES = {8: 'error', 16: 'warn', 32: 'notice', 64: 'info', 128: 'debug', 1024: 'debug-sftpxfer', } def __init__(self, name=sys.argv[0], loglevel=loglevel_DEFAULT, tag=None): """\ :param name: name of the programme that uses Python X2Go :type name: ``str`` :param loglevel: log level for Python X2Go :type loglevel: ``int`` :param tag: additional tag for all log entries :type tag: ``str`` """ self.name = os.path.basename(name) self.tag = tag self.loglevel = loglevel self.progpid = os.getpid()
[docs] def message(self, msg, loglevel=loglevel_NONE, tag=None): """\ Log a message. :param msg: log message text :type msg: ``str`` :param loglevel: log level of this message (Default value = loglevel_NONE) :type loglevel: ``int`` :param tag: additional tag for this log entry (Default value = None) :type tag: ``str`` """ if tag is None: tag = self.tag if loglevel & self.loglevel: msg = msg.replace('\n', ' ') if sys.version_info[0] < 3: msg = msg.decode(utils.get_encoding()) if self.tag is not None: self.destination.write(u'%s[%s] (%s) %s: %s\n' % (self.name, self.progpid, tag, self._loglevel_NAMES[loglevel].upper(), msg)) else: self.destination.write(u'%s[%s] %s: %s\n' % (self.name, self.progpid, self._loglevel_NAMES[loglevel].upper(), msg))
__call__ = message
[docs] def get_loglevel(self): """\ Get the current loglevel. :returns: current log level :rtype: ``int`` """ return self.loglevel
[docs] def set_loglevel(self, loglevel_name='none'): """\ Set log level by name. :param loglevel_name: name of loglevel to be set (Default value = 'none') :type loglevel_name: ``str`` """ if type(loglevel_name) is types.IntegerType: self.loglevel = loglevel_name elif type(loglevel_name) is bytes and loglevel_name in list(self._loglevel_NAMES.values()): _method = getattr(self, 'self.set_loglevel_%s' % loglevel_name) _method() else: self.loglevel = loglevel_DEFAULT
[docs] def set_loglevel_quiet(self): """\ Silence logging completely. """ self.loglevel = 0
[docs] def set_loglevel_error(self): """\ Set log level to *ERROR*. """ self.loglevel = loglevel_ERROR
[docs] def set_loglevel_warn(self): """\ Set log level to *WARN*. """ self.loglevel = loglevel_ERROR | loglevel_WARN
[docs] def set_loglevel_notice(self): """\ Set log level to *NOTICE* (default). """ self.loglevel = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE
[docs] def set_loglevel_info(self): """\ Set log level to *INFO*. """ self.loglevel = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE | loglevel_INFO
[docs] def set_loglevel_debug(self): """\ Set log level to *DEBUG*. """ self.loglevel = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE | loglevel_INFO | loglevel_DEBUG
[docs] def enable_debug_sftpxfer(self): """\ Additionally, switch on sFTP data transfer debugging """ self.loglevel = self.loglevel | loglevel_DEBUG_SFTPXFER
[docs] def disable_debug_sftpxfer(self): """\ Switch off sFTP data transfer debugging. """ self.loglevel = self.loglevel ^ loglevel_DEBUG_SFTPXFER
# compat section X2goLogger = X2GoLogger