from __future__ import print_function import syslog import sys import inspect from os.path import basename from . import misc # --- python 2 / 3 compatibility stuff try: basestring except NameError: basestring = str EMERG = syslog.LOG_EMERG ALERT = syslog.LOG_ALERT CRIT = syslog.LOG_CRIT ERR = syslog.LOG_ERR WARNING = syslog.LOG_WARNING NOTICE = syslog.LOG_NOTICE INFO = syslog.LOG_INFO DEBUG = syslog.LOG_DEBUG DEVEL = syslog.LOG_DEBUG + 1 OFF = DEVEL + 1 _level = NOTICE CONSOLE_FONT_BOLD = '\033[1m' CONSOLE_FONT_RED = '\033[31m' CONSOLE_FONT_GREEN = '\033[32m' CONSOLE_FONT_YELLOW = '\033[33m' CONSOLE_FONT_BLUE = '\033[34m' CONSOLE_FONT_MAGENTA = '\033[35m' CONSOLE_FONT_CYAN = '\033[36m' CONSOLE_FONT_WHITE = '\033[37m' CONSOLE_FONT_BLINK = '\033[5m' CONSOLE_FONT_OFF = '\033[m' f_position = 'position' f_stderr = 'stderr' f_stdout = 'stdout' f_prio = 'prio' f_color = 'color' f_default = [ f_position, f_stderr, f_prio, f_color ] _flags = set(f_default) _short_prio_str = { EMERG : '', ALERT : '', CRIT : '', ERR : '', WARNING : '', NOTICE : '', INFO : '', DEBUG : '', DEVEL : '', } _prio_colors = { DEVEL : [ "", "" ], DEBUG : [ "", "" ], INFO : [ CONSOLE_FONT_BLUE, CONSOLE_FONT_OFF ], NOTICE : [ CONSOLE_FONT_GREEN, CONSOLE_FONT_OFF ], WARNING : [ CONSOLE_FONT_YELLOW, CONSOLE_FONT_OFF ], ERR : [ CONSOLE_FONT_BOLD + CONSOLE_FONT_RED, CONSOLE_FONT_OFF ], CRIT : [ CONSOLE_FONT_BOLD + CONSOLE_FONT_MAGENTA, CONSOLE_FONT_OFF ], ALERT : [ CONSOLE_FONT_BOLD + CONSOLE_FONT_MAGENTA, CONSOLE_FONT_OFF ], EMERG : [ CONSOLE_FONT_BOLD + CONSOLE_FONT_MAGENTA, CONSOLE_FONT_OFF ], } def get_caller_pos(up = 1): assert(up == 1) # TODO: implement this caller_frame = inspect.currentframe().f_back.f_back return (basename(caller_frame.f_code.co_filename), caller_frame.f_lineno) def slog(prio, *args, **kwargs): # export if prio > _level: return msg = '' color_on = '' color_off = '' file = sys.stderr if f_prio in _flags: msg += _short_prio_str[prio] + ' ' if f_position in _flags: if 'caller' in kwargs: name, line = kwargs['caller'] else: name, line = get_caller_pos(1) msg += misc.pad(name, 20) + '[' + misc.pad(str(line), 4, True) + ']' if f_color in _flags: color_on, color_off = _prio_colors[prio] if len(args): margs = '' for a in args: margs += ' ' + str(a) msg += color_on + margs + color_off if f_stdout in _flags: file = sys.stdout if f_stderr in _flags: file = sys.stderr if len(msg): print(msg, file=file) def parse_log_prio_str(prio): # export try: r = int(prio) if r < 0 or r > DEVEL: raise Exeption("Invalid log priority ", prio) except ValueError: map_prio_str_to_val = { "EMERG" : EMERG, "emerg" : EMERG, "ALERT" : ALERT, "alert" : ALERT, "CRIT" : CRIT, "crit" : CRIT, "ERR" : ERR, "err" : ERR, "WARNING" : WARNING, "warning" : WARNING, "NOTICE" : NOTICE, "notice" : NOTICE, "INFO" : INFO, "info" : INFO, "DEBUG" : DEBUG, "debug" : DEBUG, "DEVEL" : DEVEL, "devel" : DEVEL, "OFF" : OFF, "off" : OFF, } if prio in map_prio_str_to_val: return map_prio_str_to_val[prio] raise Exception("Unknown priority string \"", prio, "\"") def prio_colors(prio): # export return _prio_colors(prio) def set_level(level_): # export global _level if isinstance(level_, basestring): _level = parse_log_prio_str(level_) return _level = level_ def set_flags(flags_): # export global _flags _flags = set(flags_.split(',')) #syslog #console #color #prio #position #ide #trace_rename_thread_to_shorter #trace_rename_thread_to_longer #trace_inout #skip_openlog #id #date #pid #highlight_first_error