Python多模块多日志记录器

7

我有两个文件,分别命名为main.pymy_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中访问。

2个回答

15

引用自日志记录文档使用相同名称多次调用 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")    

由于日志对象在第二次调用之前已经定义,因此它应该返回相同的日志对象。


1
只需要进行一点修改。同时为第二个记录器调用getLogger,例如general_logger = logging.getLogger("GENERAL")。 - Hafiz Muhammad Shafiq

1
如果您将第二个模块转换为类,那么您可以简单地执行以下操作:
  • 在第一个模块中声明记录器
  • 创建新类并将 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接