У меня есть обработчик журнала, который отправляет файл журнала на какой-либо 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)