/
MaxIs
/
savemoney
Обзор
Документация
Войти
/
MaxIs
/
savemoney
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
sm/logs/db_handler.py
63 строки
2 KB
zalma2006
добавлен flask для работы с selenium в отдельном сервисе, добавлены точки API, добавлена загрузка отчётов из источника, подробнее в HISTORY.md
15 мар 2026, 19:36
15 мар 2026, 19:36
ae3ea09
Код
Авторство
О чём код?
import re from logging import Handler, ERROR from django.utils import timezone import json import datetime import random class DBHandler(Handler, object): """ This handler will add logs to a database model defined in settings.py If log message (pre-format) is a json string, it will try to apply the array onto the log event object """ model_name = None expiry = None def __init__(self, model="", expiry=0): super(DBHandler, self).__init__() self.model_name = model self.expiry = int(expiry) def emit(self, record): # big try block here to exit silently if exception occurred try: # instantiate the model try: model = self.get_model(self.model_name) except: from logs.models import Loggers as model message = self.format(record) if record.levelno < ERROR or not str(message).__contains__('Traceback'): message = message[re.search('"', message).start():] log_entry = model(levelname=record.levelname, phost=str(f"{record.phost}:{record.pport}"), shost=str(f"{record.shost}:{record.sport}"), message=message, username=record.username, ) # test if msg is json and apply to log record object try: data = json.loads(record.msg) for key, value in data.items(): if hasattr(log_entry, key): try: print(key, value) setattr(log_entry, key, value) except: pass except: pass log_entry.save() # in 20% of time, check and delete expired logs if self.expiry and random.randint(1,5) == 1: model.objects.filter(asctime__lt = timezone.now() - datetime.timedelta(seconds=self.expiry)).delete() except: pass def get_model(self, name): names = name.split('.') mod = __import__('.'.join(names[:-1]), fromlist=names[-1:]) return getattr(mod, names[-1])