124 lines
2.4 KiB
Python
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
|