Получение последнего события в логе без чтения файла. python logging

Используется модуль python logging и лог пишется файл. При каждом запуске программы файл дописывается. В тории можно открывать файл и читать последнюю строку (файл лога может быть большим), но может где-то хранятся в памяти выведенные сообщения (или последнее сообщение), которое было отправлено в лог.


Ответы (1 шт):

Автор решения: Exord

По умолчанию вроде нет такого решения из коробки. Но вы можете написать свой хендлер с таким поведением.

import logging

class LastLogHandler(logging.Handler):
    def __init__(self):
        super().__init__()
        self.last_log = None

    def emit(self, record):
        self.last_log = self.format(record)

    def get_last_log(self):
        return self.last_log

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

file_handler = logging.FileHandler('my_log.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)

last_log_handler = LastLogHandler()
last_log_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(last_log_handler)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.error('This is an error message')

# Получаем последнее сообщение в логе
last_message = last_log_handler.get_last_log()
print('Last log message:', last_message)

=== Дополнение.

import logging

class LastLogHandler(logging.Handler):
    def __init__(self):
        super().__init__()
        self.last_log_record = None

    def emit(self, record):
        self.last_log_record = record

    def get_last_log_record(self):
        return self.last_log_record

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

file_handler = logging.FileHandler('my_log.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)

last_log_handler = LastLogHandler()
logger.addHandler(last_log_handler)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.error('This is an error message')

# Получаем последнее сообщение в логе как объект
last_log_record = last_log_handler.get_last_log_record()
if last_log_record:
    log_time = last_log_record.asctime
    log_level = last_log_record.levelname
    log_message = last_log_record.message

    print(f'Last log time: {log_time}')
    print(f'Last log level: {log_level}')
    print(f'Last log message: {log_message}')
else:
    print('No log record available')
→ Ссылка