[英]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,它接受format
和datefmt
字符串值並返回類的實例。 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.