很难把我需要的东西写进一句话,但下面的代码很好地解释了这一点:

我的日志(log)类位于一个单独的文件(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)

日志(log)消息打印得很好,但每次我都将ip_num放入实际的日志(log)消息中.我想做的是,在类中创建记录器时,将其包含在记录器的格式中,并且可能只使用ping_ip(ip)调用函数

init类方法中的格式如下:format=f"%(asctime)s %(levelname)s {ip_num}: %(message)s",这样我就不必在我创建的每个日志(log)消息中包含ip_num.在当前的类配置中,有没有一种方法可以实现这一点,或者有其他方法?(我希望尽可能地将内容分开,而不是将所有内容都放在主_文件中)

更新:

   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

有一个参数,您可以在其中为日志(log)格式提供一个包含附加值的字典.

在下面,您可以找到执行此任务的代码段:

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相关问答推荐

将numpy矩阵映射到字符串矩阵

数字梯度的意外值

如何防止Plotly在输出到PDF时减少行中的点数?

Python中的负前瞻性regex遇到麻烦

Pythind 11无法弄清楚如何访问tuple元素

@Property方法上的inspect.getmembers出现意外行为,引发异常

运行Python脚本时,用作命令行参数的SON文本

从groupby执行计算后创建新的子框架

实现自定义QWidgets作为QTimeEdit的弹出窗口

使用密钥字典重新配置嵌套字典密钥名

未知依赖项pin—1阻止conda安装""

Python中的变量每次增加超过1

在Python中使用if else或使用regex将二进制数据如111转换为001""

为什么if2/if3会提供两种不同的输出?

具有相同图例 colored颜色 和标签的堆叠子图

如何在Python Pandas中填充外部连接后的列中填充DDL值

如何根据rame中的列值分别分组值

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

如何从比较函数生成ngroup?

我什么时候应该使用帆布和标签?