Python 要记录到文件的记录器配置
Python新手。现在我已经被困在这个问题上有一段时间了。当我尝试使用Python 要记录到文件的记录器配置,python,python-2.7,logging,filehandler,Python,Python 2.7,Logging,Filehandler,Python新手。现在我已经被困在这个问题上有一段时间了。当我尝试使用iniconfiguration在文件中写入日志时,文件中没有捕获任何内容。我试图调试这个问题,但找不到任何线索。在不使用ini文件的情况下编写日志效果非常好 下面是代码和ini文件 import logging from logging.config import fileConfig def info(message): fileConfig('logging_config.ini') logger
ini
configuration在文件中写入日志时,文件中没有捕获任何内容。我试图调试这个问题,但找不到任何线索。在不使用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)
日志记录\u 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':0,
“过滤器”:[],
“处理程序”:[],
“级别”:30,
'名称':'根',
“家长”:无,
“传播”:1}
不确定它是否有用,但我注意到属性disabled
以前显示过TRUE
,但现在每次都是0
有人知道这方面的线索吗
更新:问题是由于对同一配置文件多次调用logging.config.fileConfig()造成的。但是我真的不明白为什么上次调用这个函数时什么都没写。你知道吗 记录器有一个命名约定,“简单记录器”名称因空格而无效 应该用句点替换空格。我们通常为记录器使用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(\uu name\uuu)
按模块组织记录器,则与之相同。这是因为在模块中,\uuuuuu name\uuuuu
是Python包名称空间中模块的名称
记录器有一个命名约定,“简单记录器”名称因空格而无效 应该用句点替换空格。我们通常为记录器使用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(\uu name\uuu)
按模块组织记录器,则与之相同。这是因为在模块中,\uuuuuu name\uuuuu
是Python包名称空间中模块的名称
弄明白(愚蠢的)错误是什么。实际上,info(message)
被调用了不止一次,对于info
函数中的同一配置文件,fileConfig()
也被多次调用。因此,这是一个问题。修改代码如下,它工作了
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
一样,它工作正常。找出了(愚蠢的)错误。实际上,info(message)
被调用了不止一次,对于info
函数中的同一配置文件,fileConfig()
也被多次调用。因此,这是一个问题。修改代码如下,它工作了
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
一样,它工作正常。哦,是的……你说得对。但这也不起作用。另外,我之前也尝试过,没有给logger起任何名字logger=logging.getLogger()
,但也没有起作用。不知道哪里出了问题。你能准确地解释什么不起作用吗(因为我已经测试过了)。注意:您应该在配置INI中使用完整路径。您找到日志文件了吗?日志文件已经生成。您共享的代码非常好。事实上,问题是info(message)
被调用了不止一次,同样的fileConfig()
也被调用了,因为它在info函数中是同一个配置文件[请查看下面我的答案了解详细信息]。但是我真的不明白为什么上次调用这个函数时什么都没写。你知道吗?哦,是的,你说得对。但这也不起作用。另外,我之前也尝试过,没有给logger起任何名字logger=logging.getLogger()
,但也没有起作用。不知道哪里出了问题。你能准确地解释什么不起作用吗(因为我已经测试过了)。注意:您应该在配置INI中使用完整路径。您找到日志文件了吗?日志文件已经生成。您共享的代码非常好。事实上,问题是info(message)
被调用了不止一次,同样的fileConfig()
也被调用了,因为它在info函数中是同一个配置文件[请查看下面我的答案了解详细信息]。但是我真的不明白为什么上次调用这个函数时什么都没写。你知道吗??