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')
我还检查了logger对象,看看我是否可以从其属性中获取任何线索。下面是对象
{'disabled': 0,
'filters': [],
'handlers': [<logging.FileHandler object at 0x7ff03358ce90>],
'level': 30,
'name': 'root',
'parent': None,
'propagate': 1}
不确定它是否有用,但我注意到之前显示的属性disabled
TRUE
,但现在每次都是0
。
有人对此有任何线索吗?
更新:问题是由于对同一配置文件多次调用logging.config.fileConfig()。但我真的不明白为什么在最后一次调用该函数时没有写任何内容。有什么想法?
答案 0 :(得分: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'
引用记录器对象:
该名称可能是一个以句点分隔的层次结构值,如
foo.bar.baz
(例如,它也可能只是普通的foo,
)。在分层列表中较低的记录器是列表中较高的记录器的子项。例如,给定名称为foo
的记录器,名称为foo.bar
,foo.bar.baz
和foo.bam
的记录器都是foo
的后代。记录器名称层次结构类似于Python包层次结构,如果您使用建议的构造logging.getLogger(__name__)
按模块组织记录器,则与其相同。那是因为在模块中,__name__
是Python包命名空间中的模块名称。
答案 1 :(得分:0)
弄清楚(愚蠢的)错误是什么。实际上,http://dogether.www023.in.rs/
被多次调用,因此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
一样,它可以正常工作。