Python - 记录多个文件

时间:2014-05-12 11:44:28

标签: python python-2.7 logging

我创建了一个名为 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方法中明确定义它。

1 个答案:

答案 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当时非常有用。