将Loggers`消息重定向到sys.stdout和sys.stderr

时间:2018-03-01 16:39:18

标签: python redirect logging stdout stderr

我刚开始学习Python并遇到了一个我无法解决的问题。 我想将CRITICAL之上的每个级别重定向到sys.stderr以及WARNING之上的所有级别到sys.stdout。 我想出了这个剧本......

 router.get('/pages/:page', function(req, res){
     var page = req.params.page > 0? req.params.page : 0;

     Blog.paginate({}, { page: page, limit: 2 })
       .then(function(data){
           res.render('blog/index', {blog: data.docs});
       }).catch(function(err){
           res.send(err)
     });
 });

直接运行此脚本时,我收到以下错误:

app.get("*", function(req, res) {
       res.render("pages/404page");
    });

我一直在搜索,很多人都说logging.basicConfig()可以完成这项工作,但这对我没用。

也许你们中的某些人可以帮助我。 谢谢!

1 个答案:

答案 0 :(得分:0)

您的类子类logging.Logger,因此您不应该调用getLogger或将记录器作为属性进行操作。相反,记录器在类中是self ,应该直接调整:

import logging
import sys


print("imported module {}".format(__name__))


class PyLogger(logging.Logger):
    """Wrapper for logging.Logger to redirect its message to                                                                                   
    sys.stdout or sys.stderr accordingly """

    def __init__(self, *args):
        super(PyLogger, self).__init__(self, *args)

        #####
        # self *is* the logger!                                                                                                                          
        self.setLevel(logging.DEBUG)

        # build Formatter                                                                                                                      
        formatter = logging.Formatter(fmt="%(asctime)s:%(name)s   %(message)s")

        # build StreamHandler for sys.stderr                                                                                                   
        error = logging.StreamHandler(stream=sys.stderr)
        error.setLevel(logging.CRITICAL)
        error.setFormatter(formatter)

        #####
        # Assign the handler to self
        self.addHandler(error)

        # build StreamHandler for sys.stdin                                                                                                    
        out = logging.StreamHandler(stream=sys.stdout)
        out.setFormatter(formatter)
        out.setLevel(logging.WARNING)

        #####
        # Assign the handler to self
        self.addHandler(out)


def main():
    logger = PyLogger()
    # help(logger)                                                                                                                             
    logger.info("INFO")
    logger.warning("WARN")
    logger.critical("CRIT")


if __name__ == "__main__":
    main()

按预期显示以下内容:

ely@eschaton:~/programming$ python test_logger.py 
imported module __main__
2018-03-01 11:59:41,896:<__main__.PyLogger object at 0x7fa236aa4a50>   WARN
2018-03-01 11:59:41,896:<__main__.PyLogger object at 0x7fa236aa4a50>   CRIT
2018-03-01 11:59:41,896:<__main__.PyLogger object at 0x7fa236aa4a50>   CRIT

注意关键消息如何跳过两个不同的输出处理程序,因此它出现两次(一次是因为它满足警告级别,一次是临界级别)。

在原始代码中,请注意您在logger内创建了一个名为__init__的变量,但这并未分配给self或其他任何内容。当该变量超出__init__函数的范围时会被销毁,因此任何处理程序的赋值都是没有意义的。另外,因为处理程序没有分配给self,但self引用的对象稍后将调用的记录器,这就是为什么你看到的没有处理程序的错误。