File: logger.py

package info (click to toggle)
geany-plugins 1.37%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 21,548 kB
  • sloc: ansic: 112,728; sh: 4,283; makefile: 1,630; python: 947
file content (74 lines) | stat: -rw-r--r-- 2,353 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- coding: utf-8 -*-

from geany import glog
from traceback import format_exception
import logging
import sys


GLIB_LOG_LEVEL_MAP = {
	logging.DEBUG: glog.LOG_LEVEL_DEBUG,
	logging.INFO: glog.LOG_LEVEL_INFO,
	logging.WARNING: glog.LOG_LEVEL_WARNING,
	# error and critical levels are swapped on purpose because
	# GLib interprets CRITICAL less fatal than Python and additionally
	# GLib abort()s the program on G_LOG_LEVEL_ERROR which is uncommon
	# in Python
	logging.ERROR: glog.LOG_LEVEL_CRITICAL,
	logging.CRITICAL: glog.LOG_LEVEL_ERROR,
}


class PluginLogger(object):
	"""
	Convenience wrapper softly emulating Python's logging interface.
	Any log messages are passed to the GLib log system using g_log()
	and the LOG_DOMAIN is set automatically to the plugin's name for convenience.
	"""

	def __init__(self, plugin_name):
		self._log_domain = u'geanypy-%s' % plugin_name

	def debug(self, msg_format, *args, **kwargs):
		self.log(logging.DEBUG, msg_format, *args, **kwargs)

	def info(self, msg_format, *args, **kwargs):
		self.log(logging.INFO, msg_format, *args, **kwargs)

	def message(self, msg_format, *args, **kwargs):
		self.log(glog.LOG_LEVEL_MESSAGE, msg_format, *args, **kwargs)

	def warning(self, msg_format, *args, **kwargs):
		self.log(logging.WARNING, msg_format, *args, **kwargs)

	def error(self, msg_format, *args, **kwargs):
		self.log(logging.ERROR, msg_format, *args, **kwargs)

	def exception(self, msg_format, *args, **kwargs):
		kwargs['exc_info'] = True
		self.error(msg_format, *args, **kwargs)

	def critical(self, msg_format, *args, **kwargs):
		self.log(logging.CRITICAL, msg_format, *args, **kwargs)

	warn = warning
	fatal = critical

	def log(self, level, msg_format, *args, **kwargs):
		# map log level from Python to GLib
		glib_log_level = GLIB_LOG_LEVEL_MAP.get(level, glog.LOG_LEVEL_MESSAGE)
		# format message
		log_message = msg_format % args
		# log exception information if requested
		exc_info = kwargs.get('exc_info', False)
		if exc_info:
			traceback_text = self._format_exception(exc_info)
			log_message = '%s\n%s' % (log_message, traceback_text)

		glog.glog(self._log_domain, glib_log_level, log_message)

	def _format_exception(self, exc_info):
		if not isinstance(exc_info, tuple):
			exc_info = sys.exc_info()
		exc_text_lines = format_exception(*exc_info)
		return ''.join(exc_text_lines)