簡體   English   中英

在Python的logging.config模塊中使用自定義格式化程序類

[英]Using custom formatter classes with Python's logging.config module

我有以下日志記錄類,在代碼中指定為格式化程序時工作正常。 它通過在要記錄的消息的開頭添加字符串來擴展現有格式化程序,以幫助顯示消息的重要性。 (我不只是在格式字符串中使用%(levelname)s ,因為我不想顯示DEBUG或INFO前綴。)

class PrependErrorLevelFormatter(logging.Formatter):
    def __init__(self, default):
        self._default_formatter = default
    def format(self, record):
        if record.levelno == logging.WARNING:
            record.msg = "[WARNING] " + record.msg
        elif record.levelno == logging.ERROR:
            record.msg = "[ERROR] " + record.msg
        elif record.levelno == logging.CRITICAL:
            record.msg = "[CRITICAL] " + record.msg
        return self._default_formatter.format(record)

現在我希望能夠通過logging.config.fileConfig()加載的配置文件來分配它。 我試過這樣的語法:

[formatter_PrependErrorLevelFormatter]
format=%(asctime)s  %(message)s
datefmt=%X
class=PrependErrorLevelFormatter

不幸的是我得到解決這個類的錯誤:

  File "C:\Python27\lib\logging\config.py", line 70, in fileConfig
    formatters = _create_formatters(cp)
  File "C:\Python27\lib\logging\config.py", line 127, in _create_formatters
    c = _resolve(class_name)
  File "C:\Python27\lib\logging\config.py", line 88, in _resolve
    found = __import__(used)
ImportError: No module named PrependErrorLevelFormatter

我嘗試使用它所在的模塊的名稱為類名添加前綴,但是得到相同的錯誤。 即使它可以解析類,它也可能不起作用,因為我需要提供額外的默認格式化器參數。

如何使用logging.config系統實現我想要的結果?

當您使用Python 2.7時,您可以使用dictConfig()來使用基於字典的配置:這比fileConfig()更靈活,因為它允許使用任意callables作為工廠返回例如處理程序,格式化程序或過濾器。

如果必須使用fileConfig() ,則必須構造一個callable,它接受formatdatefmt字符串值並返回類的實例。 class值只需解析為可調用類,而不是實際類。 這是一個有效的設置:在這個要點中 ,我有一個包含格式化程序定義的文件custfmt.py ,以及一個通過fileConfig()使用它的腳本fcfgtest.py 只需將文件放入臨時目錄並運行fcfgtest.py - 您應該看到如下輸出:

20:17:59 debug message
20:17:59 info message
20:17:59 [WARNING] warning message
20:17:59 [ERROR] error message
20:17:59 [CRITICAL] critical message

這似乎是你需要的。

請注意,您可以為格式化程序使用替代設計,它應該執行相同的工作:

class AltCustomFormatter(logging.Formatter):
    def format(self, record):
        if record.levelno in (logging.WARNING,
                              logging.ERROR,
                              logging.CRITICAL):
            record.msg = '[%s] %s' % (record.levelname, record.msg)
        return super(AltCustomFormatter , self).format(record)

要使用它,您不需要單獨的工廠功能,因此您可以使用

class=custfmt.AltCustomFormatter

代替

class=custfmt.factory

它應該工作 - 當我剛剛使用Python 2.7.1進行測試時它確實適用於我:-)

暫無
暫無

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

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