Модуль регистрации Python не записывает в файл журнала - PullRequest
0 голосов
/ 24 июня 2019

У меня проблема с моим скриптом, я пытаюсь создать файл журнала для каждого вызова этой функции:

@begin.subcommand
def sample_mode(sample, folder = None, reference = None, dbsnp = None):
    """ creates a config file for 1 sample

    - setup logging system: {folder}/logs/{sample}_init.log
    - takes in a sample name
    - creates a file: {folder}/{sample}_config.yaml
    """
    # get the current folder if none is given
    if folder == None:
        folder = os.getcwd() 

    # create logs folder if necessary
    if not os.path.isdir("{}/logs".format(folder)):
        os.mkdir("{}/logs".format(folder))

    log_file = setup_log(sample, folder)

    for i in range(1,3):
        try:
            os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i))
        except FileNotFoundError:
            log_file.error("{}/{}.{}.fq.gz doesn't exist".format(folder, sample, i))
            return -1

        if os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i)) == 0:
            log_file.error("\"{}/{}.{}.fq.gz\" is empty\n".format(folder, sample, i))
            return -1

    # set up logging system
    # logging.basicConfig(filename = "{}/logs/{}_init.log".format(folder, sample), level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

    # create the config file
    with open("{}/{}_config.yaml".format(folder, sample), "w") as config:
        config.write("sample: \"{}\"\n\n".format(sample))
        log_file.info("Sample name: {}".format(sample))

Для справки: функция setup_log:

def setup_log(sample, folder):
    logger = logging.getLogger(__name__)

    log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

    filename = "{}/logs/{}_init.log".format(folder, sample)

    log_handler = logging.FileHandler(filename)
    log_handler.setLevel(logging.DEBUG)
    log_handler.setFormatter(log_format)

    logger.addHandler(log_handler)

    return logger

Файл журнала создан, но он пуст. Однако, если я введу неправильное имя образца, файл журнала будет создан, и сообщение об ошибке будет записано.

Что я делаю не так?

1 Ответ

0 голосов
/ 24 июня 2019

В вашем коде есть несколько ошибок, это должно сработать:

import logging

def setup_log(name):
    logger = logging.getLogger(name)   # > set up a new name for a new logger

    logger.setLevel(logging.DEBUG)  # here is the missing line

    log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    filename = f"./test_{name}.log"
    log_handler = logging.FileHandler(filename)
    log_handler.setLevel(logging.DEBUG)
    log_handler.setFormatter(log_format)

    logger.addHandler(log_handler)

    return logger

def test_log(name):
    logger = setup_log(name)
    logger.info("Just logged from %s", name)   # > old formatting syntax is advised by the logging cookbook

test_log("log1")
test_log("log2")
test_log("log3")

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

Кроме того, вы должны знать, что logging.getLogger(name) возвращает одиночный код. Если вы вызываете функцию getLogger m с тем же именем, которое вы использовали ранее, это вернет существующий регистратор, что может привести вас к очень странной ситуации здесь ... Чтобы проиллюстрировать это:

def test_log(name):
    logger = setup_log(name)

эквивалентно

def test_log(name):
    setup_log(name)
    logger = logging.getLogger(name)

Подробнее здесь: https://docs.python.org/3/howto/logging-cookbook.html

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