jw-python/tools/python/jwutils/log.py

175 lines
4.2 KiB
Python
Raw Normal View History

from __future__ import print_function
import syslog
import sys
import inspect
from os.path import basename
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 : '<Y>',
ALERT : '<A>',
CRIT : '<C>',
ERR : '<E>',
WARNING : '<W>',
NOTICE : '<N>',
INFO : '<I>',
DEBUG : '<D>',
DEVEL : '<V>',
}
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 __pad(token, total_size, right_align = False):
add = total_size - len(token)
if add <= 0:
return token
space = ' ' * add
if right_align:
return space + token
return token + space
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 += __pad(name, 20) + '[' + __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 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