Python 日志:为什么我的非basicConfig设置不起作用?

Python 日志:为什么我的非basicConfig设置不起作用?,python,python-3.x,logging,Python,Python 3.x,Logging,我想从主模块和所有子模块登录到单个日志文件 从主文件(我在其中定义了记录器)发送的日志消息按预期工作。但是从调用导入函数发送的数据丢失了 如果我使用logging.basicConfig(如下面的示例1所示),它将正常工作。 但第二个示例允许更多自定义设置,但它不起作用 你知道为什么吗 # in the submodule I have this code import logging logger = logging.getLogger(__name__) 示例1-工作 这里我创建了两个处理

我想从主模块和所有子模块登录到单个日志文件

从主文件(我在其中定义了记录器)发送的日志消息按预期工作。但是从调用导入函数发送的数据丢失了

如果我使用logging.basicConfig(如下面的示例1所示),它将正常工作。 但第二个示例允许更多自定义设置,但它不起作用

你知道为什么吗

# in the submodule I have this code
import logging
logger = logging.getLogger(__name__)
示例1-工作

这里我创建了两个处理程序,并将它们传递给
basicConfig

# definition of root looger in main module

formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S")   

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

handler2 = logging.StreamHandler(stream=None)
handler2.setFormatter(formatter)
handler2.setLevel(logging.DEBUG)

logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG)
logger = logging.getLogger(__name__)
示例2-不工作

在这里,我创建了两个处理程序,并将它们添加到根记录器中:

# definition of root looger in main module

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
#handler.setLevel(logging.ERROR)
logger.addHandler(handler)

handler = logging.StreamHandler(stream=None)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
您需要在软件的主模块中配置(一个且仅一个)根记录器。这是通过打电话来完成的

logger = logging.getLogger() #without arguments
而不是

logger = logging.getLogger(__name__)

第二个示例使用脚本的名称创建一个单独的子记录器

如果子模块中没有定义处理程序,则日志消息将被传递到根日志记录器以处理它

相关问题可在此处找到:

示例2确实适用于我(如果我从第一行复制您的
formatter=logging.formatter(…)
行)。这个项目还有其他可能影响事情的地方吗?您真的可以在日志文件和控制台中看到
module1.DEBUG:test
?我不确定还有什么可能导致这个问题。我把这个从我的项目归结为一个最小的工作示例,它仍然显示了行为。我的第一个想法是,我对
日志记录
的单例操作做了一些错误。您调用什么来生成日志条目
logging.warn()
logger.warn()
,您应该使用
logger
(其中
warn()
只是任何日志记录方法(信息、调试等)的占位符。是的,我正在使用
logger.debug('test')
。刚刚测试
logging.debug('test'))
,也不会显示。您能显示您的根日志记录器配置吗?是的,我看到了
2018.07.01 22:02:04\uuuuu main\uuuu.DEBUG:got here
(Python 3.4)很好(它也应该出现在.log文件中).所以现在你必须弄清楚你在代码中做了哪些不同的事情-因为你知道这是可行的。问题不在于我从主模块发送的消息。它们总是在那里。但是我没有从导入的模块中获取消息。你能用一些函数创建一个模块吗?如果你调用函数,看看你是否能记录消息在第一个示例中,您正在配置根记录器,在第二个示例中,您正在使用脚本的名称创建一个单独的子记录器。如果要直接配置根记录器,请使用
logger=logging.getLogger()
而不是
logger=logging.getLogger(\u name\u)
。当然。你的提示,你的代表:)