[英]How to dynamically pass variable to class __init__ method in a custom python logging class
很難用一個句子來表達我的需要,但下面的代碼很好地解釋了它:
我的日志記錄 class 在一個單獨的文件 (log_file) 中,如下所示,並且在那里定義了一個記錄器 object:
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 function 如下所示:
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) 調用 function
所以init class 方法中的格式看起來像這樣: format=f"%(asctime)s %(levelname)s {ip_num}: %(message)s"
,這樣我就不必在里面包含 ip_num我創建的每條日志消息。 有沒有辦法在當前 class 配置或替代方法中實現這一目標? (我想盡可能地把東西分開,而不是把所有東西都放在 main_file 中)
更新:根據之前的回答,我剛剛重新定義了 class 中的日志記錄方法,以在格式中添加一個額外的參數。 例如信息 function 會像下面這樣變化,並且可以將%(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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.