代码之家  ›  专栏  ›  技术社区  ›  JON

如何在自定义python日志类中动态地将变量传递给类_init__;方法

  •  2
  • JON  · 技术社区  · 2 年前

    很难把我需要的东西写进一句话,但下面的代码很好地解释了这一点:

    我的日志类位于一个单独的文件(log_文件)中,如下所示,其中定义了一个logger对象:

    from io import StringIO
    import logging
    
    class NetddLog():
       def __init__(self, name, format="%(asctime)s %(levelname)s %(message)s", level=logging.INFO):
          self.name = name
          self.level = level
          self.format = format
    
          #Logger configuration.
          self.formatter = logging.Formatter(self.format)
          self.logger = logging.getLogger(name)#name
          self.logger.setLevel(self.level)
          #Logging to memory
          self.log_capture_string = StringIO()
          self.ch_logger = logging.StreamHandler(self.log_capture_string)
          self.ch_logger.setFormatter(self.formatter)
          self.logger.addHandler(self.ch_logger)
    
       def debug(self, msg, extra=None):
          self.logger.debug(msg, extra=extra)
    
    ip_logger = NetddLog("IP_LOG")
    

    在另一个文件(ip_文件)中,我的ping功能如下:

    from log_file import ip_logger
    from icmplib import ping
    
    def ping_ip(ip_num, ip):
        try: 
            ip_logger.info(f"{ip_num}: Pinging {ip} started")
    
            host = ping(ip, count=4, interval=1, timeout=2, payload_size=64, privileged=True)
            if host.is_alive:
                ip_logger.info(f"{ip_num}: Pinging {ip} succeded")
            else:
                raise Exception 
    
        except Exception as err:
            ip_logger.error(f"{ip_num}: Pinging {ip} failed {err}")
    

    ip_num是ip地址列表中的ip地址(ip)的编号,在另一个文件(主文件)中,我从中调用ping_ip(ip_num,ip)

    日志消息打印得很好,但每次我都将ip_num放入实际的日志消息中。我想做的是,在类中创建记录器时,将其包含在记录器的格式中,并且可能只使用ping_ip(ip)调用函数

    所以 初始化 类方法将如下所示: format=f"%(asctime)s %(levelname)s {ip_num}: %(message)s" ,这样我就不必在我创建的每个日志消息中都包含ip_num。在当前的类配置中,有没有一种方法可以实现这一点,或者有其他方法?(我希望尽可能地将内容分开,而不是将所有内容都放在主_文件中)

    更新: 根据前面的回答,我刚刚重新定义了类中的日志方法,以便在格式中添加一个额外的参数。例如,info函数的变化如下所示 %(ip_num)s 可以添加到格式中。

       def info(self, ip_num, msg):
          self.d = {'ip_num': f"{ip_num}"}
          self.logger.info(msg, extra=self.d)
    
    0 回复  |  直到 2 年前
        1
  •  1
  •   Bruno    2 年前

    是的,你可以实现你想要的,事实上,这在以下文件中有很好的记录: https://docs.python.org/3/howto/logging.html

    有一个参数,您可以在其中为日志格式提供一个包含附加值的字典。

    在下面,您可以找到执行此任务的代码段:

    import logging
    
    
    def config_log(FORMAT = '%(asctime)s %(levelname)s IP:%(ip_num)s %(message)s'):
        logging.basicConfig(filename='example.log', encoding='utf-8',format=FORMAT, level=logging.INFO)
        
    def log_something(ipnum, mymessage):
        d = {'ip_num': f"{ipnum}"}
        logging.info(mymessage, extra=d)
    
    if __name__ == "__main__":       
        config_log() 
        log_something("127.0.0.1",'Here is your message log')