Получение последнего события в логе без чтения файла. 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')