如何在自定义 python 日志记录 class 中将变量动态传递给 class __init__ 方法

How to dynamically pass variable to class __init__ method in a custom python logging class

很难用一句话表达我需要的东西,但下面的代码很好地解释了它:

我的日志记录 class 在一个单独的文件 (log_file) 中,如下所示,并且在那里定义了一个记录器对象:

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_file) 中,我的 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) 的编号,在另一个文件 (main_file) 中,我从中调用 ping_ip(ip_num, ip)

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

调用该函数

因此 init class 方法中的格式将如下所示: format=f"%(asctime)s %(levelname)s {ip_num}: %(message)s" ,这样我就不必包含 ip_num 在我创建的每条日志消息中。有没有办法在当前 class 配置或其他方法中实现这一点? (我想尽可能地把东西分开,而不是把所有东西都放在 main_file 中)

更新: 根据之前的回答,我刚刚重新定义了 class 中的日志记录方法,以在格式中添加一个额外的参数。例如信息功能会像下面这样变化,并且 %(ip_num)s 可以添加到格式中。

   def info(self, ip_num, msg):
      self.d = {'ip_num': f"{ip_num}"}
      self.logger.info(msg, extra=self.d)

是的,你可以实现你想要的,实际上在下面有很好的记录: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')