日志消息在Python控制台中出现两次

日志消息在Python控制台中出现两次,python,logging,jython,Python,Logging,Jython,我找到了一个看似相似的问题的答案,但是(因为我是Python新手),我不确定如何在我的代码中实现这个解决方案(如果它毕竟是同一个问题的话) 在我的代码中,我有以下部分: logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', filename='C:\\Tests\\T

我找到了一个看似相似的问题的答案,但是(因为我是Python新手),我不确定如何在我的代码中实现这个解决方案(如果它毕竟是同一个问题的话)

在我的代码中,我有以下部分:

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    filename='C:\\Tests\\TRACE.log',
                    filemode='a')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(consoleFormatter)
logging.getLogger('').addHandler(console)
localLog = logging.getLogger('text')
有趣的是,它过去工作得很好,但在某个时刻,它开始将这些重复的消息写入控制台


有人能在这里给我一个方向吗?

通常会出现重复的日志语句,因为有两个单独的处理程序将日志语句定向到同一个位置。有几件事值得我们去寻找问题的根源:

  • 注释掉对logging.basicConfig的调用-如果这消除了重复的日志语句,则这意味着您可能不需要手动配置第二个日志处理程序
  • 如果您使用的是IDE,那么在log语句上放置一个断点,并使用调试器,这样您就可以内省Python日志设置的状态,以便更清楚地了解附加了哪些不同的处理程序,这可能是值得的

  • 为了使日志记录更易于管理,将配置从代码中移到配置文件中可能是值得一看的——上面的Python文档是一个很好的起点。

    似乎我已经找到了这个问题的根源

    问题是,我过去常常在模块级别获取记录器。这看起来很合乎逻辑,但有一个陷阱——Python日志记录模块在从文件加载配置之前会尊重所有创建的记录器。所以基本上,当我将一个模块(在内部使用getlogger)导入到主代码(在这里我也调用了一个logger)时,它会导致logger数据流传输两次

    这个问题的可能解决办法是:

  • 不要在模块级别获取记录器
  • 禁用现有的\u记录器设置为False。从Python 2.7开始添加

  • 我的记录器配置也有同样的情况,我使用的修复程序是:

    class Logger:
    
    @staticmethod
    def setup(name, file_name):
    
        log_file = <path to save the file>
        log_file_max_size = 1024 * 1024 * 20  # megabytes
        log_num_backups = 3
        log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s"
        log_filemode = "w"  # w: overwrite; a: append
        logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG)
        rotate_file = logging.handlers.RotatingFileHandler(
            log_file, maxBytes=log_file_max_size, backupCount=log_num_backups
        )
        logger = logging.getLogger(name)
        # Console output line.
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        log_formatter = logging.Formatter(log_format)
        console_handler.setFormatter(log_formatter)
        logger.handlers = rotate_file, console_handler
    
        return logger
    
    类记录器:
    @静力学方法
    def设置(名称、文件名):
    日志文件=
    日志文件最大大小=1024*1024*20兆字节
    log\u num\u backups=3
    log_format=“%(asctime)s[%(levelname)s]:%(filename)s(%(funcName)s:%(lineno)s)>>%(message)s”
    log_filemode=“w”#w:覆盖;a:追加
    logging.basicConfig(文件名=log\u文件,格式=log\u格式,文件模式=log\u文件模式,级别=logging.DEBUG)
    rotate\u file=logging.handlers.RotatingFileHandler(
    日志文件,最大字节数=日志文件大小,备份计数=日志数
    )
    logger=logging.getLogger(名称)
    #控制台输出线。
    console_handler=logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    log\u formatter=logging.formatter(log\u格式)
    控制台\u处理程序.setFormatter(日志\u格式化程序)
    logger.handlers=旋转文件、控制台处理程序
    返回记录器
    
    您好,谢谢您的回答,但是我如何才能注释掉所有的
    日志基本配置
    ?它包括路径、格式和文件模式等强制设置…从阅读问题中,问题似乎是您在控制台中收到重复的日志消息,而文件日志记录不是问题所在。我怀疑basicConfig正在设置控制台日志处理程序,然后您正在设置第二个控制台日志处理程序。强烈建议将日志记录配置移动到一个配置文件中,这样您可以更明确地了解特定的设置。值得指出的一点是,日志记录到文件、控制台或任何其他目的地并不是强制性的—日志记录只是将消息定向到一个有用的位置以查看或存储它们的一种方式,您可能需要在许多不同的地方发送它们(文件和控制台是两个非常常见的选项)。强烈建议您阅读python文档中的,以获得日志工作原理的详细介绍。虽然这是一篇老文章,但请将输出添加到OP中。否则很难辨别具体问题是什么以及如何解决它。