我创建了一个名为 log.py 的模块,其中一个函数定义了日志的注册方式。这是原子代码:
import logging
import time
def set_up_log():
"""
Create a logging file.
"""
#
# Create the parent logger.
#
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
#
# Create a file as handler.
#
file_handler = logging.FileHandler('report\\activity.log')
file_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - % (levelname)4s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
#
# Start recording.
#
logger.info('______ STARTS RECORDING _______')
if __name__=='__main__':
set_up_log()
名为 read_file.py 的第二个模块正在使用此 log.py 来记录潜在错误。
import logging
import log
log.set_up_log()
logger = logging.getLogger(__name__)
def read_bb_file(input_file):
"""
Input_file must be the path.
Open the source_name and read the content. Return the result.
"""
content = list()
logger.info('noi')
try:
file = open(input_file, 'r')
except IOError, e:
logger.error(e)
else:
for line in file:
str = line.rstrip('\n\r')
content.append(str)
file.close()
return content
if __name__ == "__main__":
logger.info("begin execution")
c = read_bb_file('textatraiter.out')
logger.info("end execution")
在命令提示符下发出 read_file.py ,我收到此错误:
No handlers could be found for logger "__main__"
我在文件中的结果如下
2014-05-12 13:32:58,690 - log.py - log - INFO - ______ STARTS RECORDING _______
我在这里和Py Doc上阅读了很多主题,但似乎我没有正确理解它们,因为我有这个错误。 我添加我想在日志结算appart中保留一个函数,而不是在我的main方法中明确定义它。
答案 0 :(得分:2)
您有2个不同的记录器,而您只配置一个。
第一个是您在log.py
中制作并正确设置的那个。但它的名称为log
,因为您已从read_file.py
导入此模块。
第二个记录器,即您希望与第一个记录器相同的记录器,是您在logger
中分配给变量read_file.py
的记录器。它的名称将是__main__
,因为您从命令行调用此模块。您没有配置此记录器。
您可以做的是向set_up_log
添加一个参数以传递记录器的名称,例如
def set_up_log(logname):
logger = logging.getLogger(logname)
这样,您将为正确的日志记录实例设置处理程序和格式化程序。
组织层次结构中的日志是该模块的原始作者Vinay Sajip使用日志的方式。因此,您的模块只会使用__name__
给出的完全限定名称记录到日志记录实例。然后您的应用程序代码可以设置记录器,这是您尝试使用set_up_log
功能完成的。您只需要记住将相关名称传递给它,就是这样。我发现this reference当时非常有用。