在类方法中定义时,不在DEBUG模式下打印INFO级别日志消息

时间:2016-03-24 15:11:59

标签: python logging

我刚刚开始在python中尝试使用日志记录模块,我发现它非常好。我遇到了一个奇怪的问题。

我知道在DEBUG模式下,所有级别的日志都应输出到控制台。但事实似乎并非如此。

你看到下面的代码有什么问题吗?

import logging
import os

class MyClass():
    def __init__(self):
        self.logger = logging.getLogger(
                self.__class__.__name__ + '_{0}'.format(os.getpid()))
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        # create formatter
        formatter = logging.Formatter(
                '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        # add formatter to ch
        ch.setFormatter(formatter)
        # add ch to logger
        self.logger.addHandler(ch)
        self.logger.info('server is up and running, congrats!')

根据我的理解,在创建MyClass的实例时,应将信息消息打印到我的控制台。但这并不是出于某种原因而发生的。 如果我将消息的级别更改为error,那么我会得到预期的输出。

如果我按照相同的步骤创建记录器但不在类成员方法中,那么它可以工作。

1 个答案:

答案 0 :(得分:1)

您必须将setLevel设置为记录器self.logger,而不仅仅是您的处理程序ch

import logging
import os

class MyClass():
    def __init__(self):
        self.logger = logging.getLogger(
                self.__class__.__name__ + '_{0}'.format(os.getpid()))
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        self.logger.setLevel(logging.DEBUG)
        # create formatter
        formatter = logging.Formatter(
                '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        # add formatter to ch
        ch.setFormatter(formatter)
        # add ch to logger
        self.logger.addHandler(ch)
        self.logger.debug('server is up and running, congrats!')


myclass = MyClass()

输出结果为:

2016-03-24 10:11:44,319 - MyClass_73042 - DEBUG - server is up and running, congrats!

我自己的Logger(使用StreamHandler和FileHandler,日志行显示在控制台上并写入文件):

import logging
import os


class Logger:
    DEFAULT_LOG_OUTPUT = "/home/haifzhan/"

    def __init__(self, logger_name, log_file_name, log_dir=DEFAULT_LOG_OUTPUT, log_level=logging.DEBUG):
        self.logger = logging.getLogger(logger_name,)
        self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

        self.file_handler = logging.FileHandler(os.path.join(log_dir, log_file_name))
        self.file_handler.setFormatter(self.formatter)
        self.logger.setLevel(log_level)
        self.logger.addHandler(self.file_handler)

        self.console_handler = logging.StreamHandler()
        self.console_handler.setFormatter(self.formatter)
        self.console_handler.setLevel(logging.DEBUG)
        self.logger.addHandler(self.console_handler)

    def get_logger(self):
        return self.logger

要使用它,请将以下内容放在脚本的开头:

logger = Logger("my logger", "logfile.log", log_dir="/path/to/", log_level=logging.INFO).get_logger()