如何在自定义 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')
很难用一句话表达我需要的东西,但下面的代码很好地解释了它:
我的日志记录 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')