From c63027f20e4c8c2660adbd52ea7909a4d1e6bab4 Mon Sep 17 00:00:00 2001 From: Conatum Date: Mon, 18 Sep 2023 08:56:57 +0300 Subject: [PATCH] fix(logging): Split warning and error logs. --- config/example-bot.conf | 6 ++++-- src/bot.py | 2 +- src/meta/LionContext.py | 1 + src/meta/config.py | 7 +++++-- src/meta/logger.py | 22 ++++++++++++++++++---- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/config/example-bot.conf b/config/example-bot.conf index a5195d74..6ed72e6b 100644 --- a/config/example-bot.conf +++ b/config/example-bot.conf @@ -19,8 +19,10 @@ gem_transaction = log_file = bot.log general_log = -error_log = -critical_log = +error_log = %(general_log) +critical_log = %(general_log) +warning_log = %(general_log) +warning_prefix = error_prefix = critical_prefix = diff --git a/src/bot.py b/src/bot.py index a12ce61e..1e47a9e4 100644 --- a/src/bot.py +++ b/src/bot.py @@ -21,7 +21,7 @@ for name in conf.config.options('LOGGING_LEVELS', no_defaults=True): logging.getLogger(name).setLevel(conf.logging_levels[name]) -setup_main_logger() +logging_queue = setup_main_logger() logger = logging.getLogger(__name__) diff --git a/src/meta/LionContext.py b/src/meta/LionContext.py index 64746a5e..cef6754f 100644 --- a/src/meta/LionContext.py +++ b/src/meta/LionContext.py @@ -35,6 +35,7 @@ FlatContext = namedtuple( 'interaction', 'guild', 'author', + 'channel', 'alias', 'prefix', 'failed') diff --git a/src/meta/config.py b/src/meta/config.py index 621de6f6..58eb6bfa 100644 --- a/src/meta/config.py +++ b/src/meta/config.py @@ -3,7 +3,7 @@ import configparser as cfgp from .args import args -shard_number = args.shard or 0 +shard_number = args.shard class configEmoji(PartialEmoji): __slots__ = ('fallback',) @@ -87,7 +87,10 @@ class Conf: "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' diff --git a/src/meta/logger.py b/src/meta/logger.py index ddd7121a..b2464088 100644 --- a/src/meta/logger.py +++ b/src/meta/logger.py @@ -188,6 +188,14 @@ class LessThanFilter(logging.Filter): # non-zero return means we log this message 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): def __init__(self, thread_name): @@ -234,7 +242,6 @@ class ContextInjection(logging.Filter): logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out.setLevel(logging.DEBUG) logging_handler_out.setFormatter(log_fmt) -logging_handler_out.addFilter(LessThanFilter(logging.WARNING)) logging_handler_out.addFilter(ContextInjection()) logger.addHandler(logging_handler_out) log_logger.addHandler(logging_handler_out) @@ -363,14 +370,15 @@ class WebHookHandler(logging.StreamHandler): return except BucketFull: logger.warning( - f"Live logging webhook {self.webhook.id} going too fast! " - "Ignoring records until rate slows down." + "Can't keep up! " + "Ignoring records on live-logger {self.webhook.id}." ) self.ignored += 1 return else: if self.ignored > 0: logger.warning( + "Can't keep up! " f"{self.ignored} live logging records on webhook {self.webhook.id} skipped, continuing." ) self.ignored = 0 @@ -392,9 +400,15 @@ if webhook := conf.logging['general_log']: handler = WebHookHandler(webhook, batch=True) 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']: handler = WebHookHandler(webhook, prefix=conf.logging['error_prefix'], batch=True) - handler.setLevel(logging.WARNING) + handler.setLevel(logging.ERROR) handlers.append(handler) if webhook := conf.logging['critical_log']: