簡體   English   中英

使用登錄模塊的Python

[英]Python using logging in a module

我試圖找到在模塊中設置日志記錄的最佳方法,包括here ,但似乎仍然無法按預期工作。

我的文件是:

Foo
    __init__.py
    bar.py
app.py

內容是:

__init__.py

import logging

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

bar.py

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.py

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定義的格式進行格式化。

有人可以幫我了解我所缺少的嗎?

應用程序應指定日志記錄而不是庫,因此,如果要啟用foo / bar.py的日志記錄,則需要在app.py上添加一個不同於NullHandler的處理程序。 做到這一點的方法就是在實例化Bar之前添加以下行:

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

然后,bar.py的日志記錄將以您在app.py上定義的相同格式輸出。

有關更多參考,請查看有關日志記錄的python旅行者指南

為什么要輸出?

從文檔: NullHandler

位於核心日志記錄程序包中的NullHandler類不執行任何格式化或輸出。 本質上,它是供庫開發人員使用的“無操作”處理程序。

如果要將格式化程序設置為logging.basicConfig()或實例,則將其應用於logging.basicConfig() (就像對console_handler所做的那樣)。

現在,您只需將其添加到bar.logger.addHandler()(通過func fe),而不必在其他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))

暫無
暫無

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

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