class MyHandler(logging.Handler):
def __init__(self, level=logging.NOTSET, ...): # в конструктор передаёшь подключение к БД, имя таблицы ну и что там ещё надо
super().__init__(level)
... # тут сохраняешь полученное подключение, проверяешь наличие таблицы и т.п.
def emit(self, record: logging.LogRecord) -> None:
# этот метод будет вызван уже после применения фильтров: по уровню и кастомных
... # пишешь тут логику записи в БД. Логами внутри этого метода пользоваться нельзя!
class MyFilter(logging.Filter):
def filter(self, record: logging.LogRecord) -> bool:
# тут определяешь, представляет ли для тебя интерес сообщение record
return True # если представляет, верни True, иначе Falseloghandler = MyHandler(logging.NOTSET, ...) # экземпляр твоего логописца
logfilter = MyFilter() # экземпляр фильтра
loghandler.addFilter(logfilter) # привязываем фильтр
log = logger.getLogger(...)
log.addHandler(loghandler) # привязываем логописец
Полагаете, что есть какое-то сопоставление вида "пользователь домашнего интернета подключён к IP 6.7.8.9 и оттуда же одновременно происходит коннект к такому-то сайту", и на основе этого принимается решение, что это ВПН?
import asyncio
import module_A # модуль A нужен воркеру
def worker_func(x): # функция-воркер
...
async def main():
import module_B
import module_C
import concurrent.futures as cf
...
if __name__ == '__main__':
asyncio.run(main())
Если тебе нужен раздельный логгинг на постоянной основе - просто создай несколько объектов logging.Logger. Например, дочерние лог-объекты по умолчанию прокидывают сообщения родителям.
Тогда на logger_dump можешь навесить дополнительный handler, и любое сообщение в этот лог будет обрабатываться и logger в целом, и logger_dump в частности. Но, конечно, не стоит создавать отдельный логгер вообще на каждую функцию.
Альтернативно, неважную инфу можешь скинуть на уровень debug, а более важную на info. При этом обрати внимание на первый параметр Handler-класса - это уровень, который он будет писать. Т.е. у тебя на одном логе может висеть два хэндлера-логописца, но один будет писать всё подряд, а другой - только не ниже info, например. Но тогда warning и выше тоже пойдёт в оба обработчика - не думаю, что тебе это надо.