Python记录写入终端和日志文件

时间:2017-09-27 21:45:09

标签: python logging

我有两个文件:script.pyfunctions.py。在functions.py中,我有记录器设置和一组功能(由下面组成):

class ecosystem():
    def __init__(self, environment, mode):
        self.logger = logging.getLogger(__name__)
            if os.path.exists('log.log'):
                os.remove('log.log')

            handler= logging.FileHandler('log.log')
            if mode.lower()== 'info':
                handler.setLevel(logging.INFO)
                self.logger.setLevel(logging.INFO)
            elif mode.lower()== 'warning':
                handler.setLevel(logging.WARNING)
                self.logger.setLevel(logging.WARNING)
            elif mode.lower()== 'error':
                handler.setLevel(logging.ERROR)
                self.logger.setLevel(logging.ERROR)
            elif mode.lower()== 'critical':
                handler.setLevel(logging.CRITICAL)
                self.logger.setLevel(logging.CRITICAL)
            else:
                handler.setLevel(logging.DEBUG)
                self.logger.setLevel(logging.DEBUG)

            #Logging file format
            formatter = logging.Formatter('    %(levelname)s | %(asctime)s | %(message)s \n')
            handler.setFormatter(formatter)
            #Add the handler to the logger
            self.logger.addHandler(handler)

            self.logger.info('Logging starts here')

    def my_function():
        self.logger.debug('test log'))
        return True

我正在尝试从ecosystem.my_function拨打script.py,但是当我这样做时,logger.debug消息会显示在终端窗口AND log.log中。任何想法为什么会这样?

如果有帮助,我还会将其他模块导入functions.py,如果这些模块也导入日志记录,可能会导致问题吗?

1 个答案:

答案 0 :(得分:1)

看起来您正在使用log.log__init__方法中的ecosystem文件初始化记录器。这意味着创建ecosystem对象的任何代码都将初始化记录器。在代码的某处,在一个文件中,您正在创建该对象,因此初始化记录器并写入该文件。

请注意,您不需要自己调用__init__,因为它是在创建对象时调用的。即。在这次电话会议之后

my_obj = ecosystem()

将写入日志文件。

您问为什么在附加新文件处理程序后使用stderr和文件。这是因为传播属性。默认情况下,传播为True,这意味着您的日志将冒出记录器的层次结构,每个记录器将继续处理它。由于默认根记录器位于层次结构的顶部,因此它也将处理您的日志。将propagate设为False可解决此问题:

self.logger.propagate = False

您可能想在logging上稍微阅读一下。此外,如果您想保持关于记录的理智,check how you can use dict to configure logging