Python - 多文件日志记录

1 投票
1 回答
1410 浏览
提问于 2025-04-18 06:17

我创建了一个叫做 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 个回答

2

你有两个不同的日志记录器,但你只配置了一个。

第一个是在 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 函数实现的。你只需要记得传递相关的名字,就可以了。我发现 这个参考资料 当时非常有用。

撰写回答