Python日志写入多个单独的日志文件

时间:2017-12-01 01:54:53

标签: python django

我有一个Django Web应用程序,它运行一堆帮助程序脚本。每个脚本都编写自己的日志。我注意到脚本正在写入彼此的日志。这些脚本由单独的用户/会话启动。怎么回事?

以下是ScriptA

中记录器的实现
import logging
   logging.basicConfig(format='%(asctime)s %(message)s',filename='/var/logs/scriptA.log',level=logging.DEBUG)  

  logging.info("INFO: test log from scriptA"))

同样适用于scriptB,但是有人说运行scriptB,它会写入scriptA.log而不是scriptB.log

似乎日志记录创建了一个共享的全局模块。我怎么能阻止这个

编辑:此处的大多数解决方案适用于同一类中的2个单独日志。我的问题是写入彼此日志的单独脚本/类

1 个答案:

答案 0 :(得分:1)

是的,Python的日志记录模块是一个全局模块。我之前遇到过同样的问题。我使用此代码来分隔每个模块/类的日志。

import logging
import sys

class SampleCass:
    def __init__(self):
        self.set_logger()
        self.log = logging.getLogger(__name__)

    @run_one
    def set_logger():
        # this separates the logging from different modules
        logger = logging.getLogger(__name__)

        console_handler = logging.StreamHandler(sys.stdout)
        logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter('[%(asctime)s %(levelname)s ' +
                                      '%(name)s]: %(message)s',
                                      '%Y-%m-%d %H:%M:%S')

        console_handler.setFormatter(formatter)
        # add the handler to the class logger
        logger.addHandler(console_handler)

def run_once(func):
    """
    A decorator to run function only once
    :type func: __builtin__.function
    :return:
    """
    def wrapper(*args, **kwargs):
        """
        :param args:
        :param kwargs:
        :return:
        """
        if not wrapper.has_run:
            wrapper.has_run = True
            return func(*args, **kwargs)

    wrapper.has_run = False
    return wrapper

现在您可以为您的类使用self.log,它不会干扰其他模块的日志记录。 run_one函数确保在导入函数时,它只运行一次且只运行一次。希望它能帮到你。