簡體   English   中英

Python自定義記錄器不打印到控制台

[英]Python custom logger not printing to console

我正在編寫一個 Python Flask 應用程序,並且只想為我自己的代碼設置日志級別。 如果我將根記錄器設置為 DEBUG,我會收到垃圾郵件,所以我想我會設置我自己的記錄器,我可以為其設置日志級別。

這是在啟動時運行的代碼:

# File: server/__init__.py

import logging
def create_app(config=None):
    log = logging.getLogger("api_log")
    log.setLevel("DEBUG")
    print("Log level: " + logging.getLevelName(log.level)) # Outputs "DEBUG"
    log.debug("Does not show")
    log.warning("Does show")

出於某種原因,即使將日志級別調整為DEBUGlog.debug命令也不會向文件輸出任何內容。

誰能發現我做錯了什么?

編輯#1:在我的情況下,當我添加處理程序log.addHandler(logging.StreamHandler())時, DEBUG語句會輸出到控制台。 我不明白為什么我需要創建另一個處理程序來獲得正確的輸出。 它也會弄亂我的測試代碼輸出,但我會針對該問題創建另一篇文章。

Logging HOWTO文檔中的以下兩段解釋了為什么必須設置處理程序:

記錄器有一個有效級別的概念。 如果未在記錄器上明確設置級別,則使用其父級的級別作為其有效級別。 如果父級沒有明確的級別集,則檢查其父級,依此類推 - 搜索所有祖先,直到找到明確設置的級別。 根記錄器始終具有明確的級別集(默認情況下為警告)。 在決定是否處理一個事件時,通過logger的有效級別來決定該事件是否被傳遞給了logger的handler。

子記錄器將消息傳播到與其祖先記錄器關聯的處理程序。 因此,沒有必要為應用程序使用的所有記錄器定義和配置處理程序。 為頂級記錄器配置處理程序並根據需要創建子記錄器就足夠了。 (但是,您可以通過將記錄器的傳播屬性設置為 False 來關閉傳播。)

這里有兩個關鍵點:

  1. 記錄器將其消息傳遞給處理程序以決定是否應記錄該消息。
  2. 在顯式設置處理程序之前,使用了默認處理程序(其級別設置為 WARNING)。

暫無
暫無

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

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