Python - 多文件日志记录
我创建了一个叫做 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上看了很多相关的内容,但似乎没有理解透彻,所以才会出现这个错误。我想补充的是,我希望把日志的设置放在一个函数里,而不是直接在我的主方法中定义。
1 个回答
你有两个不同的日志记录器,但你只配置了一个。
第一个是在 log.py
中创建的,设置得很正确。不过它的名字是 log
,因为你从 read_file.py
中导入了这个模块。第二个日志记录器,你希望它和第一个是一样的,是你在 read_file.py
中赋值给变量 logger
的那个。它的名字是 __main__
,因为你是从命令行调用这个模块的。你并没有配置这个日志记录器。
你可以做的是给 set_up_log
添加一个参数,用来传递日志记录器的名字,比如:
def set_up_log(logname):
logger = logging.getLogger(logname)
这样,你就能为正确的日志实例设置处理器和格式化器。
按照层级组织你的日志是 Vinay Sajip(这个模块的原作者)设计日志记录时的初衷。因此,你的模块应该只记录到一个具有完整名称的日志实例,这个名称由 __name__
提供。然后你的应用代码可以设置这些日志记录器,这正是你想通过 set_up_log
函数实现的。你只需要记得传递相关的名字,就可以了。我发现 这个参考资料 当时非常有用。