【问题标题】:Python logging. Use fileConfig and setLoggerClass togetherPython 日志记录。一起使用 fileConfig 和 setLoggerClass
【发布时间】: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


    【解决方案1】:

    问题在于 %(record_id) 在非自定义上下文中不可用,因此记录器在尝试插入格式化字符串时会在内部引发 KeyError

    【讨论】:

    • 但它在自定义上下文中可用,我需要使用配置文件中描述的记录器和自定义记录器类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2012-02-13
    • 1970-01-01
    • 2016-01-25
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多