【问题标题】:Python multiple logger for multiple modules用于多个模块的 Python 多个记录器
【发布时间】:2016-09-27 07:42:23
【问题描述】:

我有两个文件 namley main.py 和 my_modules.py。在 main.py 中,我定义了两个这样的记录器

    #main.py
    URL_LOGS = "logs/urls.log"
    GEN_LOGS = 'logs/scrape.log'
    #Create two logger files    
    formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s', datefmt="%Y-%m-%d %H:%M:%S")
    # first file logger
    url_info_logger = logging.getLogger('URL_Fetcher')
    hdlr_1 = logging.FileHandler(URL_LOGS)
    hdlr_1.setFormatter(formatter)
    url_info_logger.setLevel(logging.DEBUG)
    url_info_logger.addHandler(hdlr_1)

    #second Logger
    general_logger = logging.getLogger("GENERAL")
    hdlr_2 = logging.FileHandler(GEN_LOGS)
    hdlr_2.setFormatter(formatter)
    general_logger.setLevel(logging.DEBUG)
    general_logger.addHandler(hdlr_2)

   module1()
   do_something()

在我的第二个文件(my_modules.py)中,我必须同时使用两个记录器,以下是 my_modules.py 的示例代码

 #my_modules.py   
 import logging

    def module1():
        general_logger.info("Logger Module1")
        url_info_logger.info("New URL found")

    def do_something():
        general_logger.info("Logger Module2")
        url_info_logger.info("Url parsed")    

如何实现在 my_modules.py 中访问的记录器

【问题讨论】:

    标签: python logging


    【解决方案1】:

    引用logging documentation:多次调用具有相同名称的 getLogger() 将始终返回对同一 Logger 对象的引用。

    所以你想在你的 my_modules.py 中做的只是用相同的名字再次调用getLogger()。

    #my_modules.py   
    import logging
    
    url_info_logger = logging.getLogger('URL_Fetcher')
    general_logger = logging.getLogger("GENERAL")
    
    def module1():
        general_logger.info("Logger Module1")
        url_info_logger.info("New URL found")
    
    def do_something():
        general_logger.info("Logger Module2")
        url_info_logger.info("Url parsed")    
    

    它应该返回相同的日志记录对象,因为它在您第二次调用它之前就已经定义了。

    【讨论】:

    • 稍作修改。还为第二个记录器调用 getLogger,例如 general_logger = logging.getLogger("GENERAL")
    【解决方案2】:

    如果你转换类中的第二个模块,你可以简单地:

    • 在第一个模块中声明记录器
    • 创建将 2 记录器作为参数传递的新类
    • 在新类中使用记录器

    例子:

    import logging
    
    class MyClassName:
    
        def __init__(self, general_logger, url_info_logger):
        self.general_logger = general_logger
        self.url_info_logger = url_info_logger
    
        def module1(self):
        self.general_logger.info("Logger Module1")
        self.url_info_logger.info("New URL found")
    
        def do_something(self):
        self.general_logger.info("Logger Module2")
        self.url_info_logger.info("Url parsed")
    

    在主要的

    #main.py
    ...
    myobj = MyClassName(general_logger,url_info_logger)
    myobj.do_something()
    myobj.module1()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2017-07-14
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多