elasticsearch,marshalling,logstash,Ruby,elasticsearch,Marshalling,Logstash" /> elasticsearch,marshalling,logstash,Ruby,elasticsearch,Marshalling,Logstash" />

Ruby 有没有办法从object.inspect方法的输出中重新创建对象?

Ruby 有没有办法从object.inspect方法的输出中重新创建对象?,ruby,elasticsearch,marshalling,logstash,Ruby,elasticsearch,Marshalling,Logstash,在使用开源ELK堆栈时,我们遇到了一个问题,其中一个Logstash输入snmptrap以一种我们无法使用的方式格式化数据。在类中有一个名为agent\u address的实例变量,该变量存储为。对于熟悉SNMP工作方式的任何人来说,在网络上使用陷阱中继时,在确定SNMP陷阱的来源时,代理地址非常重要 当您查看Logstash在接收到陷阱时生成的事件时,就可以看到问题。主要地,agent\u address变量的inspect方法是转储与任何有效数据都不匹配的数据 示例事件看起来有点像这样: #

在使用开源ELK堆栈时,我们遇到了一个问题,其中一个Logstash输入snmptrap以一种我们无法使用的方式格式化数据。在类中有一个名为
agent\u address
的实例变量,该变量存储为。对于熟悉SNMP工作方式的任何人来说,在网络上使用陷阱中继时,在确定SNMP陷阱的来源时,代理地址非常重要

当您查看Logstash在接收到陷阱时生成的事件时,就可以看到问题。主要地,
agent\u address
变量的
inspect
方法是转储与任何有效数据都不匹配的数据

示例事件看起来有点像这样:

#<SNMP::SNMPv1_Trap:0x2db53346 @enterprise=[1.3.6.1.4.1.6827.10.17.3.1.1.1], @timestamp=#<SNMP::TimeTicks:0x2a643dd1 @value=0>, @varbind_list=[#<SNMP::VarBind:0x2d5043a5 @name=[1.0], @value=#<SNMP::Integer:0x29fb6a4a @value=1>>], @specific_trap=1000, @source_ip=\"192.168.87.228\", @agent_addr=#<SNMP::IpAddress:0x227a4011 @value=\"\\xC0\\xA8V\\xFE\">, @generic_trap=6>
将产生
192.168.86.254
,而:

require 'snmp'
include SNMP
address = IpAddress.new(192.168.86.254)
puts address.inspect
将产生:

#<SNMP::IpAddress:0x0000000168ae88 @value="\xC0\xA8V\xFE">
是否可以使用值为1的字段重新创建整数对象?。如果这是可能的,是否也有方法以相同的方式重新创建嵌套对象?例如,给定字符串:

#<SNMP::SNMPv1_Trap:0x2ef73621 @value=1, @agent_address=#<SNMP::IpAddress:0x0000000168ae88 @value="\xC0\xA8V\xFE">>
如果我有
Object#inspect
返回的原始、未格式化和默认字符串转储,有没有办法动态地重新创建用于创建此inspect转储的对象

否。
inspect
用于调试目的,供人类读取

它不能保证是机器可读的。不同的Ruby版本之间不能保证相同。在不同的Ruby实现中不能保证是相同的。它甚至不能保证在实现相同Ruby版本的同一Ruby实现的不同版本之间是相同的。见鬼,我甚至不认为保证两次跑步都是一样的

它不是序列化格式


有很多专门针对Ruby(
Marshal
)或一般(XML、YAML、JSON,当然还有ASN.1)的序列化格式,但是
inspect
不是吗。

它没有回答您的问题(因此评论),但我们最近替换了snmptrap输入(由一个单独的、较小的日志库处理,该日志库将它们放入redis中以增强恢复力)使用snmptrapd。它为我们提供了更大的处理灵活性,并消除了对redis的需求。欢迎使用SO。我们不关心您是否是SO或语言新手,我们只希望您进行研究并向我们展示您的努力。请阅读“”包括底部的链接,以及“”。如果他们没有为类实现
inspect
方法,你为什么不呢?你可以用许多不同的方式覆盖方法。而且,根据我们的工作经验,SNMP MIB在完整性和准确性方面无处不在。我们让他们返回原始/二进制数据,要求我编写代码来分解结构并将其转换为b确认可用信息。如果对象的状态完全由其实例变量决定(没有全局变量,某些哈希类变量中没有条目,没有其他奇怪的),并且
inspect
输出包含所有这些值,则可以使用相同的值(但不是相同的对象)重建对象。另外—如果您有一个对象的inspect字符串仍然是“活动的”(未被垃圾收集,在某处仍有引用),您可以执行一个
对象空间(SNMP::SNMPv1\u Trap)
search在其inspect字符串中查找具有匹配地址的对象(至少,对于当前版本的YARV,我认为它是一个地址)。
#<Integer:0x2737476 @value=1>
#<SNMP::SNMPv1_Trap:0x2ef73621 @value=1, @agent_address=#<SNMP::IpAddress:0x0000000168ae88 @value="\xC0\xA8V\xFE">>
SNMP::SNMPv1_Trap{
  @value : 1
  @agent_address : SNMP::IpAddress{
      @value : 1
  }
}