Вход в консоль Python - PullRequest
       45

Вход в консоль Python

0 голосов
/ 29 января 2019

Я пытаюсь создать журнал в Python 3.x, который пишет в консоль.Вот мой код:

import logging
import sys

class Temp:
    def __init__(self, is_verbose=False):
        # configuring log
        if (is_verbose):
            self.log_level=logging.DEBUG
        else:
            self.log_level=logging.INFO

        log_format = logging.Formatter('[%(asctime)s] [%(levelname)s] - %(message)s')
        logging.basicConfig(level=self.log_level, format=log_format)
        self.log = logging.getLogger(__name__)

        # writing to stdout
        handler = logging.StreamHandler(sys.stdout)
        handler.setLevel(self.log_level)
        handler.setFormatter(log_format)
        self.log.addHandler(handler)

        # here
        self.log.debug("test")

if __name__ == "__main__":
    t = Temp(True)

Если после «здесь» введена строка, Python выдает ошибку:

[2019-01-29 15:54:20,093] [DEBUG] - test
--- Logging error ---
Traceback (most recent call last):
  File "C:\Programok\Python 36\lib\logging\__init__.py", line 993, in emit
    msg = self.format(record)
  File "C:\Programok\Python 36\lib\logging\__init__.py", line 839, in format
    return fmt.format(record)
  File "C:\Programok\Python 36\lib\logging\__init__.py", line 577, in format
    if self.usesTime():
  File "C:\Programok\Python 36\lib\logging\__init__.py", line 545, in usesTime
    return self._style.usesTime()
  File "C:\Programok\Python 36\lib\logging\__init__.py", line 388, in usesTime
    return self._fmt.find(self.asctime_search) >= 0
AttributeError: 'Formatter' object has no attribute 'find'
...

В моем коде есть и другие места, которые печатаются вжурнал, но ничего не записывается в стандартный вывод, даже если строка после «здесь» удаляется.

В чем может быть проблема?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Просматривая аналогичную проблему в системе отслеживания ошибок Python (https://bugs.python.org/issue16368),, вы можете видеть, что аргумент formatter ожидается в виде строки (отсюда и попытка вызвать find):

log_format = '[%(asctime)s] [%(levelname)s] - %(message)s'
logging.basicConfig(level=self.log_level, format=log_format)
0 голосов
/ 29 января 2019

Проблема возникает из-за вызова basicConfig, который устанавливает обработчик журнала для stderr, а также принимает строку формата, а не форматер.Поскольку вы выполняете эту работу самостоятельно позже, вам не нужно использовать функцию basicConfig.Дополнительную информацию можно найти в документации на python.

Удаление вызова на basicConfig и добавление self.log.setLevel(self.log_level) решит проблему, которую вы видите.

Рабочий код:

import logging                                                                  
import sys                                                                      

class Temp:                                                                     
    def __init__(self, is_verbose=False):                                       
        # configuring log                                                       
        if (is_verbose):                                                        
            self.log_level=logging.DEBUG                                        
        else:                                                                   
            self.log_level=logging.INFO                                         

        log_format = logging.Formatter('[%(asctime)s] [%(levelname)s] - %(message)s')
        self.log = logging.getLogger(__name__)                                  
        self.log.setLevel(self.log_level)                                       

        # writing to stdout                                                     
        handler = logging.StreamHandler(sys.stdout)                             
        handler.setLevel(self.log_level)                                        
        handler.setFormatter(log_format)                                        
        self.log.addHandler(handler)                                            

        # here                                                                  
        self.log.debug("test")                                                  

if __name__ == "__main__":                                                      
    t = Temp(True)
...