2017-05-27 61 views
0

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()多次调用所致。但是我不明白为什么最后一次调用该函数时没有写入任何内容。任何想法呢?

回答

0

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

2

记录器有一个命名约定,名称“简单记录器”由于空间而无效。

您应该用一段时间来替换空格。我们通常使用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' 

引用Logger对象:

名称是一个潜在的时间段隔开的分层值,像foo.bar.baz(尽管它也可能只是例如平原foo,)。在分层列表中更靠后的记录器是列表中较高记录器的子记录器。例如,给定一个名称为foo的记录器,名称为foo.bar,foo.bar.bazfoo.bam的记录器都是foo的后代。记录器名称层次结构类似于Python包层次结构,如果使用建议的构造logging.getLogger(__name__)以模块为单位组织记录器,则其类似于Python包层次结构。这是因为在模块中,__name__是Python包命名空间中的模块名称。

+0

哦,是的......你说得对。但与此同时它也不起作用。另外,我之前尝试过的大多数时候都没有给logger任何名字'logger = logging.getLogger()',但那也没有奏效。不知道那里出了什么问题。 – qwerty

+1

你能解释一下哪些工作不正常(因为我已经测试过了)。注意:你应该在配置INI中使用完整路径。你有没有找到你的日志文件? –

+0

日志文件已被生成。你分享的代码非常好。实际上,问题在于'info(message)'不止一次被调用,fileConfig()'也被调用了相同的配置文件,因为它在info函数内* [请检查我的答案以获得详细信息] *。但是我不明白为什么最后一次调用该函数时没有写入任何内容。任何想法呢? – qwerty