Py学习  »  Python

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

Jon • 1 年前 • 450 次点击  

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

我的日志类位于一个单独的文件(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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133950
 
450 次点击  
文章 [ 1 ]  |  最新文章 1 年前