很难把我需要的东西写进一句话,但下面的代码很好地解释了这一点:
我的日志类位于一个单独的文件(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)