Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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 - Fatal编程技术网

Python 为什么';是否将此自定义记录器日志信息发送到控制台和文件?

Python 为什么';是否将此自定义记录器日志信息发送到控制台和文件?,python,Python,我在my_logging.py中定义了一个记录器函数: def my_logger(name): print("warn:", name) logger = logging.getLogger(name) # Create handlers c_handler = logging.StreamHandler() f_handler = logging.FileHandler('logs/demo.log') c_handler.setLevel(

我在my_logging.py中定义了一个记录器函数:

def my_logger(name):
    print("warn:", name)
    logger = logging.getLogger(name)

    # Create handlers
    c_handler = logging.StreamHandler()
    f_handler = logging.FileHandler('logs/demo.log')
    c_handler.setLevel(logging.INFO)
    f_handler.setLevel(logging.INFO)

    # Create formatters and add it to handlers
    c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)

    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)

    return logger
然后我在test.py中使用它:

import my_logging

logger = my_logging.my_logger(__name__)

logger.info("This is a test!")
它根本不记录!我之所以要将记录器放入函数中,是因为我希望它在多个模块中使用,使用相同的日志记录配置

这里有什么问题?我进行了测试,似乎它与处理程序的setLevel()方法有关。logging.INFO没有效果。

在doc for中,您可以看到根记录器使用
级别,并且可能会阻止处理程序中的
INFO
级别

您必须为根记录器设置
INFO
level

logger = logging.getLogger(name)

logger.setLevel(logging.INFO)
如果还需要
DEBUG
消息,则必须为根记录器和处理程序设置
DEBUG
级别

logger.setLevel(logging.DEBUG)

c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.DEBUG)
为处理程序使用不同的级别,您只能在屏幕上或仅向文件发送调试消息。

在doc for中,您可以看到根记录器使用
级别,并且可能会阻止处理程序中的
信息
级别

您必须为根记录器设置
INFO
level

logger = logging.getLogger(name)

logger.setLevel(logging.INFO)
如果还需要
DEBUG
消息,则必须为根记录器和处理程序设置
DEBUG
级别

logger.setLevel(logging.DEBUG)

c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.DEBUG)

使用不同级别的处理程序,您可以仅在屏幕上或仅向文件发送调试消息。

如果我在
my_logger()中添加
logger.setLevel(logging.INFO)
。my setLevel在my_logger()函数中。@您只是简单地复制了代码,它就可以工作了吗?奇怪的是,您仅对
c\u处理程序
f\u处理程序
使用
setLevel
。您可能还需要将其设置为
logger
是的,我复制了代码,但它不起作用。但是当我设置全局级别-
logger.setLevel(logging.INFO)
,它就开始工作了。@furas,我添加了logger.setLevel(logging.INFO),我可以打印信息、警告和错误,但不能调试。为什么呢?INFO是最低级别,对吗?如果我在
my\u logger()中添加
logger.setLevel(logging.INFO)
。my setLevel在my_logger()函数中。@您只是简单地复制了代码,它就可以工作了吗?奇怪的是,您仅对
c\u处理程序
f\u处理程序
使用
setLevel
。您可能还需要将其设置为
logger
是的,我复制了代码,但它不起作用。但是当我设置全局级别-
logger.setLevel(logging.INFO)
,它就开始工作了。@furas,我添加了logger.setLevel(logging.INFO),我可以打印信息、警告和错误,但不能调试。为什么呢?信息是最低级的,对吗?