【问题标题】:logger configuration to log to file记录器配置以记录到文件
【发布时间】:2017-05-27 06:03:23
【问题描述】:

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() 造成的。但是我真的不明白为什么最后一次调用该函数时什么也没写。有什么想法吗?

【问题讨论】:

    标签: python python-2.7 logging filehandler


    【解决方案1】:

    loggers有一个命名约定,“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.barfoo.bar.bazfoo.bam 的记录器都是foo 的后代。记录器名称层次结构类似于 Python 包层次结构,如果您使用推荐的构造 logging.getLogger(__name__) 按模块组织记录器,则与它相同。这是因为在模块中,__name__ 是 Python 包命名空间中的模块名称。

    【讨论】:

    • 哦,是的……你说得对。但这样也行不通。另外,我之前尝试过的主要是没有给记录器任何名称logger = logging.getLogger(),但这也没有奏效。不知道那里出了什么问题。
    • 你能准确解释什么不起作用(因为我已经测试过了)。注意:您应该在配置 INI 中使用完整路径。你找到你的日志文件了吗?
    • 日志文件已经生成。您共享的代码非常好。实际上,问题在于info(message) 被多次调用,fileConfig() 也被调用,因为它与 info 函数中的配置文件相同[请在下面查看我的答案以了解详细信息]。但是我真的不明白为什么最后一次调用该函数时什么也没写。有什么想法吗??
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2019-07-26
      • 2010-12-29
      • 2022-01-11
      相关资源
      最近更新 更多