我有一个包含几个模块的项目。有一个主模块(main.py)创建TK GUI并加载数据。它将这些数据传递给process.py,后者使用checks.py中的函数处理数据。我正在尝试为所有模块实现日志记录以记录到文件。在main.py中,日志消息被写入日志文件,而在其他模块中,它们仅被写入控制台。我认为这与在main.py中的代码设置记录器之前执行部分代码的import模块行有关,但是我无法解决如何避免这种情况。在Stackoverflow上,这似乎是一个相当普遍的问题,但我无法获得其他对我有用的答案。我相信我不会错过太多。简化的代码如下所示:
在模块中各种功能的内部和外部移动日志记录代码。我开始使用的代码是Corey Schaffer的Youtube频道中的代码。
import logging
from process import process_data
def main():
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
templogfile = tempfile.gettempdir() + '\\' + 'TST_HA_Debug.log'
file_handler = logging.FileHandler(templogfile)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.debug('Logging has started') # This gets written to the file
process_data(data_object) # call process_data in process.py
import logging
def process_data(data):
logger = logging.getLogger(__name__)
logger.debug('This message is logged by process') #This wont get written to the log file but get written to the console
#do some stuff with data here and log some msgs
return
Main.py将写入日志文件,process.py将仅写入控制台。
答案 0 :(得分:1)
我已经稍微重写了您的脚本,以便此代码可以独立存在。如果我对此进行了太多更改,请告诉我,我可以重新进行检查。这两个文件是将其记录到文件的示例。注意我的评论:
## main.py
import logging
from process import process_data
import os
def main():
# Give this logger a name
logger = logging.getLogger("Example")
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
# I changed this to the same directory, for convenience
templogfile = os.path.join(os.getcwd(), 'TST_HA_Debug.log')
file_handler = logging.FileHandler(templogfile)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logging.getLogger("Example").debug('Logging has started') # This still gets written to the file
process_data() # call process_data in process.py
if __name__ == '__main__':
main()
## process.py
import logging
def process_data(data=None):
# make sure to grab the correct logger
logger = logging.getLogger("Example")
logger.debug('This message is logged by process') # This does get logged to file now
#do some stuff with data here and log some msgs
return
为什么这样做?由于模块级功能使用默认的根记录器,因此它不是您配置的。有关更多信息,请参见these docs。还有一个类似的问题更深入here。
通过在开始记录之前获取已配置的记录器,便可以记录到正确的配置。希望这会有所帮助!