用户创建了一个名为 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 来记录潜在的错误。以下是 read_file.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 _______
2、解决方案
根据用户的描述,他遇到了以下两个问题:
- 在 log.py 中创建了两个不同的日志记录器,但只配置了一个。
- 在 read_file.py 中,logger 变量被分配给了一个与 log.py 中的 logger 不同的实例。
为了解决这些问题,我们需要对代码进行一些修改:
首先,在 log.py 中,我们需要将 __name__
作为参数传递给 set_up_log
函数,并使用该参数来创建日志记录器。这样可以确保我们在 log.py 和 read_file.py 中使用的是同一个日志记录器。
def set_up_log(log_name):
"""
Create a logging file.
"""
#
# Create the parent logger.
#
logger = logging.getLogger(log_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 _______')
然后,在 read_file.py 中,我们需要在调用 set_up_log
函数时,将 __name__
作为参数传递给它。
import logging
import log
log.set_up_log(__name__)
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")
这样,我们就可以确保在 log.py 和 read_file.py 中使用的是同一个日志记录器,并且可以正确地记录日志。
最后,需要注意的是,在实际使用中,我们可能会需要将日志记录器配置得更加复杂,例如,我们可以将日志记录器配置成输出到不同的文件,或者配置不同的日志级别等。这些配置可以通过修改 set_up_log
函数来实现。