fix(logging): Split warning and error logs.

This commit is contained in:
2023-09-18 08:56:57 +03:00
parent a27e07be97
commit c63027f20e
5 changed files with 29 additions and 9 deletions

View File

@@ -19,8 +19,10 @@ gem_transaction =
log_file = bot.log log_file = bot.log
general_log = general_log =
error_log = error_log = %(general_log)
critical_log = critical_log = %(general_log)
warning_log = %(general_log)
warning_prefix =
error_prefix = error_prefix =
critical_prefix = critical_prefix =

View File

@@ -21,7 +21,7 @@ for name in conf.config.options('LOGGING_LEVELS', no_defaults=True):
logging.getLogger(name).setLevel(conf.logging_levels[name]) logging.getLogger(name).setLevel(conf.logging_levels[name])
setup_main_logger() logging_queue = setup_main_logger()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@@ -35,6 +35,7 @@ FlatContext = namedtuple(
'interaction', 'interaction',
'guild', 'guild',
'author', 'author',
'channel',
'alias', 'alias',
'prefix', 'prefix',
'failed') 'failed')

View File

@@ -3,7 +3,7 @@ import configparser as cfgp
from .args import args from .args import args
shard_number = args.shard or 0 shard_number = args.shard
class configEmoji(PartialEmoji): class configEmoji(PartialEmoji):
__slots__ = ('fallback',) __slots__ = ('fallback',)
@@ -87,7 +87,10 @@ class Conf:
"emoji": configEmoji.from_str, "emoji": configEmoji.from_str,
} }
) )
self.config.read(configfile)
with open(configfile) as conff:
# Opening with read_file mainly to ensure the file exists
self.config.read_file(conff)
self.section_name = section_name if section_name in self.config else 'DEFAULT' self.section_name = section_name if section_name in self.config else 'DEFAULT'

View File

@@ -188,6 +188,14 @@ class LessThanFilter(logging.Filter):
# non-zero return means we log this message # non-zero return means we log this message
return 1 if record.levelno < self.max_level else 0 return 1 if record.levelno < self.max_level else 0
class ExactLevelFilter(logging.Filter):
def __init__(self, target_level, name=""):
super().__init__(name)
self.target_level = target_level
def filter(self, record):
return (record.levelno == self.target_level)
class ThreadFilter(logging.Filter): class ThreadFilter(logging.Filter):
def __init__(self, thread_name): def __init__(self, thread_name):
@@ -234,7 +242,6 @@ class ContextInjection(logging.Filter):
logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out = logging.StreamHandler(sys.stdout)
logging_handler_out.setLevel(logging.DEBUG) logging_handler_out.setLevel(logging.DEBUG)
logging_handler_out.setFormatter(log_fmt) logging_handler_out.setFormatter(log_fmt)
logging_handler_out.addFilter(LessThanFilter(logging.WARNING))
logging_handler_out.addFilter(ContextInjection()) logging_handler_out.addFilter(ContextInjection())
logger.addHandler(logging_handler_out) logger.addHandler(logging_handler_out)
log_logger.addHandler(logging_handler_out) log_logger.addHandler(logging_handler_out)
@@ -363,14 +370,15 @@ class WebHookHandler(logging.StreamHandler):
return return
except BucketFull: except BucketFull:
logger.warning( logger.warning(
f"Live logging webhook {self.webhook.id} going too fast! " "Can't keep up! "
"Ignoring records until rate slows down." "Ignoring records on live-logger {self.webhook.id}."
) )
self.ignored += 1 self.ignored += 1
return return
else: else:
if self.ignored > 0: if self.ignored > 0:
logger.warning( logger.warning(
"Can't keep up! "
f"{self.ignored} live logging records on webhook {self.webhook.id} skipped, continuing." f"{self.ignored} live logging records on webhook {self.webhook.id} skipped, continuing."
) )
self.ignored = 0 self.ignored = 0
@@ -392,9 +400,15 @@ if webhook := conf.logging['general_log']:
handler = WebHookHandler(webhook, batch=True) handler = WebHookHandler(webhook, batch=True)
handlers.append(handler) handlers.append(handler)
if webhook := conf.logging['warning_log']:
handler = WebHookHandler(webhook, prefix=conf.logging['warning_prefix'], batch=True)
handler.addFilter(ExactLevelFilter(logging.WARNING))
handler.setLevel(logging.WARNING)
handlers.append(handler)
if webhook := conf.logging['error_log']: if webhook := conf.logging['error_log']:
handler = WebHookHandler(webhook, prefix=conf.logging['error_prefix'], batch=True) handler = WebHookHandler(webhook, prefix=conf.logging['error_prefix'], batch=True)
handler.setLevel(logging.WARNING) handler.setLevel(logging.ERROR)
handlers.append(handler) handlers.append(handler)
if webhook := conf.logging['critical_log']: if webhook := conf.logging['critical_log']: