Рубрики
Без рубрики

Регистрация Python: как войти в несколько местоположений

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

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

import logging

#----------------------------------------------------------------------
def log(path, multipleLocs=False):
    """
    Log to multiple locations if multipleLocs is True
    """
    fmt_str = '%(asctime)s - %(name)s - %(message)s'
    formatter = logging.Formatter(fmt_str)
    
    logging.basicConfig(filename=path, level=logging.INFO,
                        format=fmt_str)
    
    if multipleLocs:
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        console.setFormatter(formatter)
           
        logging.getLogger("").addHandler(console)
               
    logging.info("This is an informational message")
    try:
        1 / 0
    except ZeroDivisionError:
        logging.exception("You can't do that!")
        
    logging.critical("THIS IS A SHOW STOPPER!!!")
    
if __name__ == "__main__":
    log("sample.log") # log only to file
    log("sample2.log", multipleLocs=True) # log to file AND console!

Как вы можете видеть, когда вы передаете True To Verive Argum, скрипт создаст экземпляр StreamHandler () который вы можете настроить и добавлять в текущий регистратор через следующий вызов:

logging.getLogger("").addHandler(console)

Это отлично работает на Linux, но на Windows 7 образец2.log Не было создано, поэтому мне пришлось изменить заявление о если следующее:

if multipleLocs:
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    console.setFormatter(formatter)
    
    fhandler = logging.FileHandler(path)
    fhandler.setFormatter(formatter)

    logging.getLogger("").addHandler(console)
    logging.getLogger("").addHandler(fhandler)

Теперь я должен отметить, что это приводит к тому, что это вызывает довольно странную ошибку в том, что Python каким-то образом отслеживает имена файлов, которые я пишу через вызовы в мою функцию журнала, так что, когда я скажу ему, чтобы написать в образец2.log, он пишешь на него плюс Оригинальный образец.log. Чтобы обойти это, мы должны создать экземпляр регистратора с уникальным именем каждый раз, когда мы называем сценарий. Вот обновленный пример, который работает правильно:

import logging
import os

#----------------------------------------------------------------------
def log(path, multipleLocs=False):
    """
    Log to multiple locations if multipleLocs is True
    """
    fname = os.path.splitext(path)[0]
    logger = logging.getLogger("Test_logger_%s" % fname)
    logger.setLevel(logging.INFO)
    fh = logging.FileHandler(path)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    
    if multipleLocs:
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        console.setFormatter(formatter)
        logger.addHandler(console)
        
    logger.info("This is an informational message")
    try:
        1 / 0
    except ZeroDivisionError:
        logger.exception("You can't do that!")
        
    logger.critical("THIS IS A SHOW STOPPER!!!")
    
if __name__ == "__main__":
    log("sample.log") # log only to file
    log("sample2.log", multipleLocs=True) # log to file AND console!

Вы отметите, что на этот раз мы основываем имя регистратора в имени файла журнала. Модуль ведения журнала довольно симпатичный и очень весело играть с. Я надеюсь, что вы нашли это как интересно, как я.