Как предотвратить появление ошибок модуля ведения журнала python, останавливающих выполнение во время простоя, постоянных повторных попыток и буферных событий

У меня есть процесс Python, выходные данные которого регистрируются, среди других обработчиков, на сервере системного журнала через tcp. Время от времени сервер системного журнала может останавливаться. Мне нужно, чтобы скрипт работал независимо от механизма ведения журнала. Существуют ли какие-либо параметры/обычно используемые (или встроенные) библиотеки для буферизации журналов и повторных попыток до бесконечности, которые мне могут не хватать, или мне нужно написать собственный класс-оболочку для моего ведения журнала, который обрабатывает буферизацию и повторные попытки?

Проблема возникает, когда я останавливаю сервер системного журнала, и в этом случае любой оператор «регистратора» вызывает ошибку и останавливает выполнение сценария.

import logging
from logging.handlers import SysLogHandler
...
logger = logging.getLogger()
handler = SysLogHandler(address=syslog_address, socktype=socket.SOCK_STREAM)
logger.addHandler(handler)
...
logger.info("Some statements all over my code I want logged and buffered if possible but I do not want to raise exceptions stopping execution and I don't want to repeat myself wrapping them all in try/except blocks"

person Luis Díaz    schedule 19.08.2019    source источник


Ответы (1)


Встроенная функция Python для этого — QueueHandler. . Что вы делаете, так это перемещаете SysLogHandler в отдельный поток (или процесс) с помощью QueueListener и заменяете его QueueHandler в приложении. Таким образом вы изолируете свое приложение от сбоев, вызванных системным журналом, а сообщения очереди автоматически буферизуются. Реализовать бесконечный повтор с помощью очереди довольно легко, просто верните неудавшиеся задачи обратно.

person blues    schedule 19.08.2019
comment
Спасибо, я упускаю из виду, что обработчик Queue поможет - person Luis Díaz; 20.08.2019