Как получить файл, в который в данный момент входит модуль регистрации Python? - PullRequest
7 голосов
/ 22 июля 2010

Есть ли способ сделать это? Если logging.config.fileConfig('some.log') является установщиком, то каков получатель? Просто любопытно, если это существует.

Ответы [ 5 ]

9 голосов
/ 17 октября 2011

Мне нужно было сделать что-то похожее в очень простой среде журналирования, следующая процедура сделала свое дело

def _find_logger_basefilename(self, logger):
    """Finds the logger base filename(s) currently there is only one
    """
    log_file = None
    parent = logger.__dict__['parent']
    if parent.__class__.__name__ == 'RootLogger':
        # this is where the file name lives
        for h in logger.__dict__['handlers']:
            if h.__class__.__name__ == 'TimedRotatingFileHandler':
                log_file = h.baseFilename
    else:
        log_file = self._find_logger_basefilename(parent)

    return log_file    

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

Не уверен, как это будет происходить в любой сложной среде ведения журналов.

7 голосов
/ 11 июля 2015

Для моего основного использования журнала одного файла это работало

logging.getLoggerClass().root.handlers[0].baseFilename
5 голосов
/ 22 июля 2010

logging.config.fileConfig('some.log') попытается прочитать конфигурацию журнала из some.log.

Я не верю, что существует общий способ получения файла назначения - это не так.не всегда гарантировано даже идти в файл.(Может идти в системный журнал, по сети и т. Д.)

0 голосов
/ 25 мая 2017

Ниже простая логика для обработчика одного файла:

>>> import logging
>>> logger = logging.getLogger("test")
>>> handler = logging.FileHandler("testlog.log")
>>> logger.addHandler(handler)
>>> print logger.handlers[0].baseFilename
/home/nav/testlog.log
>>>
0 голосов
/ 03 июля 2014

В моем случае я использовал для инициализации один логгер (в моем основном скрипте) и использовал его во всех моих пакетах, выполняя locallogger = logging.getLogger(__name__). В этой настройке, чтобы получить путь к файлу журнала, мне пришлось изменить ответ @ Джона следующим образом

def find_rootlogger_basefilename():
"""Finds the root logger base filename
"""
log_file = None
rootlogger = logging.getLogger('')
for h in rootlogger.__dict__['handlers']:
    if h.__class__.__name__ == 'FileHandler':
        log_file = h.baseFilename
        break
    elif h.__class__.__name__ == 'TimedRotatingFileHandler':
        log_file = h.baseFilename
        break

return log_file   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...