簡體   English   中英

記錄器配置以記錄到文件

[英]logger configuration to log to file

Python新手。 現在我已經堅持了一段時間。 當我嘗試使用ini配置在文件中寫入日志時,文件中未捕獲任何內容。 我試圖調試問題,但是沒有任何線索。 在不使用ini文件的情況下編寫日志非常正常。

下面是代碼和ini文件

import logging

from logging.config import fileConfig

def info(message):


    fileConfig('logging_config.ini')
    logger=logging.getLogger("simple logger")

    logger.warning('Something is not right')
    logger.warning(message)

logging_config.ini

[loggers]
keys=root

[handlers]
keys=file_handler

[logger_root]
level=WARNING
handlers=file_handler

[formatters]
keys=formatter

[formatter_formatter]
format='%(message)s'

[handler_file_handler]
class=FileHandler
level=WARNING
formatter=formatter
args=('dummyoutput.log','w')

我還檢查了記錄器對象,以查看是否可以從其屬性中獲得任何線索。 下面是對象

{'disabled': 0,
 'filters': [],
 'handlers': [<logging.FileHandler object at 0x7ff03358ce90>],
 'level': 30,
 'name': 'root',
 'parent': None,
 'propagate': 1}

不知道它是否有用,但是我注意到disabled的屬性先前顯示為TRUE但現在每次都為0

有人對此有任何線索嗎?

更新:問題是由於對同一配置文件多次調用logging.config.fileConfig()引起的。 但是我真的不明白為什么最后一次調用該函數時什么也沒寫。 有什么想法嗎?

記錄器有一個命名約定,並且由於空間限制,名稱“ simple logger”無效。

您應該用句點代替空格。 我們通常將Python軟件包名稱用於記錄器。

解決方法如下:

import logging

from logging.config import fileConfig


def info(message):

    fileConfig('logging_config.ini')
    logger = logging.getLogger("simple.logger")

    logger.warning('Something is not right')
    logger.warning(message)


if __name__ == "__main__":
    info("hello")

完美地蘇醒。

'Something is not right'
'hello'

引用記錄器對象:

該名稱可能是用句點分隔的分層值,例如foo.bar.baz (例如foo,也可以是純foo, )。 層次結構列表中位於最下方的記錄器是列表中較高處的記錄器的子級。 例如,給定名稱為foo記錄器,名稱為foo.barfoo.bar.bazfoo.bam記錄器都是foo后代。 記錄器名稱層次結構類似於Python包層次結構,如果您使用建議的構造logging.getLogger(__name__)在每個模塊的基礎上組織記錄器,則記錄器名稱層次結構與Python包層次結構相同。 這是因為在模塊中, __name__是Python包命名空間中模塊的名稱。

弄清楚什么是(愚蠢的)錯誤。 實際上, info(message)被調用了不止一次,因此同一個配置文件的fileConfig()info函數內部一樣。 因此,問題。 修改代碼如下,它可以工作。

import logging
from logging.config import fileConfig

def info(message):

    logger.warning('Something is not right')
    logger.warning(message)

fileConfig('logging_config.ini')
logger=logging.getLogger("simple.logger")

更新:即使我們不遵循記錄器命名約定,例如。 正如我給simple logger而不是simple.logger它工作正常。

暫無
暫無

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

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