izzylib/IzzyLib/logging.py

124 lines
2.4 KiB
Python

import sys
from IzzyLib.misc import DotDict
from os import getppid, environ as env
from datetime import datetime
from enum import Enum
class Levels(Enum):
CRITICAL = 60,
ERROR = 50
WARNING = 40
INFO = 30
VERBOSE = 20
DEBUG = 10
MERP = 0
class Log:
__slots__ = [
'name', 'level', 'date', 'format',
'critical', 'error', 'warning',
'info', 'verbose', 'debug', 'merp'
]
def __init__(self, name, **config):
self.name = name
self.level = Levels.INFO
self.date = True
self.format = '%Y-%m-%d %H:%M:%S'
self.update_config(**config)
for level in Levels:
self._set_log_function(level)
def _set_log_function(self, level):
setattr(self, level.name.lower(), lambda *args: self.log(level, *args))
def print(self, *args):
sys.stdout.write(' '.join([str(arg) for arg in args]))
sys.stdout.flush()
def parse_level(self, level):
try:
return Levels(int(level))
except ValueError:
return getattr(Levels, level.upper())
def update_config(self, **data):
for key, value in data.items():
self.set_config(key, value)
def set_config(self, key, value):
if key == 'level' and type(value) == str:
value = self.parse_level(value)
setattr(self, key, value)
def get_config(self, key):
return self[key]
def print_config(self):
self.print(*(f'{k}: {v}\n' for k,v in self.items()))
def log(self, level, *msg):
if level.value < self.level.value:
return
default = self.name == 'Default'
options = [
level.name + ':',
' '.join([str(message) for message in msg]),
'\n'
]
if self.date and not getppid() == 1:
options.insert(0, datetime.now().strftime(self.format))
if not default:
options.insert(0 if not self.date else 1, f'[{self.name}]')
self.print(*options)
def get_logger(name, **config):
try:
return logger[name.lower()]
except KeyError:
log = Log(name, **config)
logger[name.lower()] = log
return log
'''create a default logger'''
logger = {
'default': Log('Default')
}
DefaultLog = logger['default']
'''aliases for default logger's log output functions'''
critical = DefaultLog.critical
error = DefaultLog.error
warning = DefaultLog.warning
info = DefaultLog.info
verbose = DefaultLog.verbose
debug = DefaultLog.debug
merp = DefaultLog.merp
'''aliases for the default logger's config functions'''
update_config = DefaultLog.update_config
set_config = DefaultLog.set_config
get_config = DefaultLog.get_config
print_config = DefaultLog.print_config