Python使用登录模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python使用登录模块相关的知识,希望对你有一定的参考价值。

我试图找到在模块中设置日志记录的最佳方法,包括here,但我仍然无法像我预期的那样使日志记录工作。

我的文件是:

Foo
    __init__.py
    bar.py
app.py

内容如下:

__init__.朋友

import logging

logging.getLogger(__name__).addHandler(logging.NullHandler())

把人.朋友

import logging

class Bar(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        #self.logger.addHandler(logging.StreamHandler())
        self.logger.warning('Logger - Create bar')
        print('Print - Create bar')

app.朋友

from foo.bar import Bar
import logging

# create logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to console_handler
console_handler.setFormatter(formatter)

# add console_handler to logger
logger.addHandler(console_handler)

bar = Bar()

以此格式运行app.py不会生成日志记录输出。

但如果我取消注释bar.py中的行:

self.logger.addHandler(logging.StreamHandler())

我得到了日志记录,但没有像app.py定义的格式化。

有人可以帮我理解我错过的东西吗?

答案

你为什么要输出?

来自文档:NullHandler

位于核心日志记录包中的NullHandler类不执行任何格式化或输出。它本质上是一个供库开发人员使用的“无操作”处理程序。

如果要将其设置为常规默认值或实例(就像您对logging.basicConfig()所做的那样),格式化程序将应用于console_handler

现在你只需要将它添加到bar.logger.addHandler()(通过func f.e.),而不是在你的其他py文件中创建一个名为与bar中成员相同的新变量。

本质上:你有多个记录器,如果你打印名称,你会得到一些东西:

Foo
__main__
Foo.bar

您只能配置main的Formatter,而不是其他。


要调试设置什么以及是否设置任何处理程序/格式字符串:

for l in logging.Logger.manager.loggerDict:
    loggr = logging.Logger.manager.loggerDict[l]
    print("Found logger: " + l)
    if loggr.handlers:
        for h in loggr.handlers:
            formr = loggr.handlers[0].formatter
            if formr:
                print("        {} {}".format(l, formr._fmt))
            else:
                print("        {} has no formatter set.".format(l))
    else:
        print("    {} has no handlers.".format(l))
另一答案

应用程序应该指定日志而不是库,因此如果要启用foo / bar.py的日志记录,则需要在app.py上添加与NullHandler不同的处理程序。这样做的方法是在实例化Bar之前添加以下行:

logging.getLogger('foo').addHandler(console_handler)

然后将使用您在app.py上定义的相同格式输出bar.py中的日志记录。

如需进一步参考,请查看the hitchhiker's guide to python section about logging

以上是关于Python使用登录模块的主要内容,如果未能解决你的问题,请参考以下文章

Python 常用模块学习

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

python 使用requests模块, 如何模拟进行登录并执行之后的操作?

Python学习(22):模块

Python - 模块