簡體   English   中英

如何在自定義 python 日志記錄 class 中將變量動態傳遞給 class __init__ 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM