簡體   English   中英

在類方法中定義時,不會在 DEBUG 模式下打印 INFO 級別的日志消息

[英]INFO level logging message not printed on DEBUG mode when defined inside class method

我剛開始在 python 中試驗日志模塊,我發現它非常好。 不過我遇到了一個奇怪的問題。

我知道在調試模式下,所有級別的日志都應該輸出到控制台。 但情況似乎並非如此。

你看到下面的代碼有什么問題嗎?

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那么我會得到預期的輸出。

如果我遵循相同的過程來創建記錄器但不在類成員方法中,那么它就可以工作。

您必須將self.logger為您的記錄器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!

我自己的記錄器(使用 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM