gpt4 book ai didi

python - 如何动态地将变量传递给自定义 python 日志记录类中的类 __init__ 方法

转载 作者:行者123 更新时间:2023-12-05 05:43:58 26 4
gpt4 key购买 nike

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

我的日志记录类在一个单独的文件 (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 放在实际的日志消息中。我想要做的是,在类中创建记录器时将其包含在记录器的格式中,并且可能只是使用 ping_ip(ip) 调用该函数

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

更新:根据之前的回答,我刚刚在类中重新定义了日志记录方法,以在格式中添加一个额外的参数。例如信息功能会像下面这样改变,并且可以将 %(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')

关于python - 如何动态地将变量传递给自定义 python 日志记录类中的类 __init__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71698579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com