【问题标题】:Logging module can't load the good configuration日志模块无法加载好的配置
【发布时间】:2020-08-27 11:51:35
【问题描述】:

当我的模块 A 由我的模块 B 导入时,我不知道如何使用不同的日志记录配置,但使用另一个日志记录配置。有关如何解决此问题的任何想法?

模块A代码:

logging.basicConfig(filename="/var/log/ModuleA",format="%(asctime)s %(message)s",datefmt="%d/%m/%Y %H:%M:%S")
log=logging.getLogger(__name__)
logging.Formatter.converter = time.gmtime
logging.setLevel(logging.DEBUG)

模块 B 代码:

import ModuleA      
logging.basicConfig(filename="/var/log/ModuleB",format="%(asctime)s %(message)s",datefmt="%d/%m/%Y %H:%M:%S")                                                                                                                                                                                          log=logging.getLogger(__name__)
logging.Formatter.converter = time.gmtime
logging.setLevel(logging.DEBUG)

【问题讨论】:

    标签: python python-3.x python-logging


    【解决方案1】:

    basicConfig 每个进程只能运行一次(或者,好吧,当根记录器没有配置时)。

    如果您希望不同的模块登录到不同的位置,则必须相应地配置它们的记录器 - 最好在导入模块的应用程序代码中执行此操作,而不是在模块本身中。定义日志输出的去向不是他们关心的问题。

    例如,您可以使用 the dictConfig API 配置两个命名记录器,module1module2,以及它们的处理程序和格式化程序:

    import logging
    from logging.config import dictConfig
    
    dictConfig(
        {
            "version": 1,
            "disable_existing_loggers": False,
            "formatters": {"my_format": {"format": "%(asctime)s %(message)s", "datefmt": "%d/%m/%Y %H:%M:%S",},},
            "handlers": {
                "file_a": {"level": "INFO", "class": "logging.FileHandler", "filename": "a.log", "formatter": "my_format",},
                "file_b": {"level": "INFO", "class": "logging.FileHandler", "filename": "b.log", "formatter": "my_format",},
            },
            "loggers": {
                "module1": {"handlers": ["file_a"], "level": "INFO", "propagate": False,},
                "module2": {"handlers": ["file_b"], "level": "INFO", "propagate": False,},
            },
        }
    )
    

    然后,假装这些在module1module2

    log1 = logging.getLogger("module1")
    log1.info("Hello")
    
    log2 = logging.getLogger("module2")
    log2.info("World")
    

    你最终会在a.log 中得到Hello,在b.log 中得到World

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 2015-01-13
      • 2021-12-16
      • 2012-12-05
      • 2023-03-16
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多