Ведение журнала Python: укажите путь к файлу журнала из основного модуля. - PullRequest
0 голосов
/ 12 июня 2018

Можно ли как-нибудь предоставить имя файла для логгера из моего основного модуля?

Я использую следующий способ, но он не работает. Все журналы идут в файл xyz.log вместо main.log

Обновлено в соответствии с предложением nosklo

logger.py

formatter = logging.Formatter(fmt='[%(asctime)s] - {%(filename)s:%(lineno)d} %(levelname)s - %(message)s')


def _get_file_handler(file_name="xyz.log"):
    file_handler = logging.FileHandler(file_name)
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)
    return file_handler


def get_logger(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(_get_file_handler())
    return logger

parser.py

log = logger.get_logger(__name__)


def parse():
    log.info("is there anyway this could go to main.log and xyz.log")

main.py

log = logger.get_logger(__name__)
if __name__ == '__main__':

    for handler in log.handlers:
        if isinstance(handler, logging.FileHandler):
            log.removeHandler(handler)
            log.addHandler(logger._get_file_handler())

    log.info("is there anyway this could go to main.log and xyz.log?")
    parser.parse()

Есть ли способ установить Имя файла журнала из моего main.py модуля, а не из logger.pyмодуль

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Экземпляры ведения журнала могут иметь несколько обработчиков файлов.Используйте такую ​​функцию, чтобы просто добавить другой обработчик с дополнительным желаемым выходным путем.Сообщения журнала будут отправляться в оба (или все) текстовые журналы, добавленные к экземпляру.Вы даже можете настроить обработчики на разные уровни ведения журнала, чтобы можно было фильтровать сообщения в разные журналы на наличие критических ошибок, информационных сообщений и т. Д.

import logging
def add_handler(output_log_path, log):
    # Set up text logger and add it to logging instance
    file_logger = logging.FileHandler(output_log_path)
    file_logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s | logger name: %(name)s | module: %(module)s | lineno: %(lineno)d | %(message)s')
    file_logger.setFormatter(formatter)
    log.addHandler(file_logger)
    return log
0 голосов
/ 12 июня 2018

Сначала вы вызываете get_logger(), поэтому, когда вы устанавливаете атрибут класса в FileName.file_name = "main.log", функция get_logger уже завершена, и регистратор уже определен для записи в xyz.log;Изменение переменной позже не приведет к изменению регистратора, так как он уже определен.

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

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