Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 要记录到文件的记录器配置_Python_Python 2.7_Logging_Filehandler - Fatal编程技术网

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

Python新手。现在我已经被困在这个问题上有一段时间了。当我尝试使用
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函数中是同一个配置文件[请查看下面我的答案了解详细信息]。但是我真的不明白为什么上次调用这个函数时什么都没写。你知道吗??