繁体   English   中英

记录器配置以记录到文件

[英]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”无效。

您应该用句点代替空格。 我们通常将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'

引用记录器对象:

该名称可能是用句点分隔的分层值,例如foo.bar.baz (例如foo,也可以是纯foo, )。 层次结构列表中位于最下方的记录器是列表中较高处的记录器的子级。 例如,给定名称为foo记录器,名称为foo.barfoo.bar.bazfoo.bam记录器都是foo后代。 记录器名称层次结构类似于Python包层次结构,如果您使用建议的构造logging.getLogger(__name__)在每个模块的基础上组织记录器,则记录器名称层次结构与Python包层次结构相同。 这是因为在模块中, __name__是Python包命名空间中模块的名称。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM