【发布时间】:2022-01-18 10:50:40
【问题描述】:
我创建了一个自定义记录器类并在 config.cfg 文件中描述了记录器配置。 当我加载配置并将记录器类设置为我的自定义类时,从 getLogger 中选择的记录器仍然是默认记录器。
一般来说,我希望为不同的事件使用不同的记录器,并且我不想登录与我的自定义记录器冲突的第三方库。
我的配置:
[loggers]
keys=root,fileLogger
[handlers]
keys=consoleHandler,fileHandler, dbHandler
[formatters]
keys=standardFormatter
[logger_root]
level=NOTSET
handlers=
[logger_fileLogger]
level=DEBUG
handlers=fileHandler
qualname=root.fileLogger
propagate=0
[logger_dbLogger]
level=INFO
handlers=dbHandler
qualname=dbLogger
propagate=1
[handler_consoleHandler]
class=StreamHandler
level=NOTSET
formatter=standardFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=standardFormatter
args=('log.log',)
[handler_dbHandler]
class=loggers.handlers.db_handler.DBHandler
level=INFO
formatter=standardFormatter
args=()
[formatter_standardFormatter]
format=%(asctime)s; %(record_id)s; %(levelname)s; %(mdl)s; %(obj)s; %(status)s; %(message)s
datefmt=%d.%m.%Y %H:%M:%S
用法
import logging
from logging.config import fileConfig
from loggers.custom_logger import CustomLogger
logging.setLoggerClass(CustomLogger)
fileConfig('loggers/config.cfg')
logger = logging.getLogger('root.fileLogger')
logger.info('A', 'B', 'C')
自定义记录器接受一堆参数,并且适用于使用不在配置文件中的名称创建的记录器,但是对于名称“root.fileLogger”,上面代码的输出是
--- Logging error ---
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 1083, in emit
msg = self.format(record)
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 927, in format
return fmt.format(record)
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 663, in format
record.message = record.getMessage()
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 367, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "<stdin>", line 1, in <module>
Message: 'A'
Arguments: ('B', 'C')
任何想法为什么会发生以及如何处理它?
【问题讨论】:
标签: python python-3.x logging