Порядок регистрации в Python нескольких обработчиков - PullRequest
0 голосов
/ 31 октября 2018

У меня есть обработчик журнала, который отправляет файл журнала на какой-либо URL-адрес, если происходит критическое событие журнала, и очищает файл журнала, поскольку он уже находится в месте назначения. Я также использую FileHandler, чтобы записать все журналы в файл.

Я добавляю оба журнала в Logger, каждый на своем уровне, но поскольку отправка файлов журнала в критических событиях имеет смысл, только если в файл записано критическое сообщение, я должен убедиться, что FileHandler вызывается ДО моего пользовательского обработчика.

Я знаю, что могу добавить только один регистратор и наследовать от FileHandler и вызывать методы родителей, когда это не является критическим событием, но я бы хотел, чтобы приложение решило, когда пора отправлять журналы. Есть идеи, как это сделать?

Вот как я добавляю обработчики:

    log = logging.getLogger(__name__)
    log.setLevel(logging.DEBUG)
    log_handler = handlers.TimedRotatingFileHandler(filename=os.path.join(CurrentConfig.LOG_PATH, 'runner.log'), when='d', interval=1, backupCount=3)
    log_handler.setLevel(logging.DEBUG)
    pwx_handler = PwxHandler()
    pwx_handler.setLevel(logging.ERROR)
    formatter = logging.Formatter('[%(asctime)s][%(levelname)s] %(message)s')
    log_handler.setFormatter(formatter)
    log.addHandler(log_handler)
    log.addHandler(pwx_handler)

А это мой пользовательский обработчик:

from logging import Handler
from glob import glob
from CurrentConfig import CurrentConfig
from datetime import datetime
import requests
from zipfile import ZipFile, ZIP_BZIP2
from os.path import join, basename, splitext
from os import remove
from daemon import Daemon

class PwxHandler(Handler):

    def __init__(self):
        super().__init__()
        self.headers = Daemon().headers

    def emit(self, record):
        super().emit(record)
        logs = glob('/home/guilhon/Projetos/robot-daemon/logs/' + '*.log')
        # logs = glob(CurrentConfig.LOG_PATH + '*.log')
        current_time = datetime.now().strftime('%H_%M_%S')
        zipped_logs = ZipFile(join('/home/guilhon/Projetos/robot-daemon/logs/un', 'zipped_logs_'+current_time+'.zip'), 'w', ZIP_BZIP2)
        # zipped_logs = ZipFile(join(CurrentConfig.LOG_PATH, 'zipped_logs.zip'), 'w', ZIP_BZIP2)
        for log in logs:
            filename = splitext(basename(log))
            zipped_logs.write(log, filename[0] + current_time + filename[1])
        zipped_logs.close()
        # Trunca os arquivos de log
        for log in logs:
            open(log, 'w')
        response = requests.post(CurrentConfig.URL_SERVER + '/robot/log/',
                                 json={'robot_name': CurrentConfig.ROBOT_NAME},
                                 files={'zipped_log': zipped_logs.filename},
                                 verify=CurrentConfig.VERIFY_SSL,
                                 headers=self.headers,
                                 timeout=30)
        if response.status_code == requests.codes.created:
            remove(zipped_logs.filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...