记录器配置以记录到文件

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" 无效,因为 space。

您应该用句点替换 space。我们通常使用 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'

引用记录器对象:

The name is potentially a period-separated hierarchical value, like foo.bar.baz (though it could also be just plain foo, for example). Loggers that are further down in the hierarchical list are children of loggers higher up in the list. For example, given a logger with a name of foo, loggers with names of foo.bar, foo.bar.baz, and foo.bam are all descendants of foo. The logger name hierarchy is analogous to the Python package hierarchy, and identical to it if you organise your loggers on a per-module basis using the recommended construction logging.getLogger(__name__). That’s because in a module, __name__ is the module’s name in the Python package namespace.

找出(愚蠢的)错误是什么。实际上 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 它工作正常。