Log4j网络适配器发送的事件作为一个序列化java对象。我想是能够捕捉到这个目的和deserialise它在不同的语言(python).这可能吗?

注意到 该网络的拍摄是件容易的事;它只是一个TCP socket和阅读,在一个流。困难的是的deserialising的一部分

有帮助吗?

解决方案

一般来说,没有。

流格式Java化定义 在这个文件, 但是你需要访问的原类定义(和a Java运行时将它们载入)转该流数据回到东西接近原始的对象。例如,课程可以定义writeObject()和readObject()法定制他们自己的化的形式。

(编辑: lubos hasko表明具有一个小java程序deserialize的对象前面的蟒蛇,但问题是,对于这项工作,你的"小java程序"需要加载的相同版本的所有同类的,它可能deserialize.这是非常棘手的如果你收的日志信息从一个应用程序,并真正棘手的如果你在复用多于一个日志的流。无论哪种方式,它不是一个小小的程序的任何更多。 edit2: 我可能错在这里,我不知道什么序列化。如果它只是log4j课你应该好。另一方面,它可以登录任意的例外情况,如果他们放在流以及我的观点的立场。)

它会更容易自log4j网络适配器和替换的原序列的一些更容易-deserialized形式(例如,你可以使用坦克把对象到一种XML表示)

其他提示

理论上, ,这是可能的。Java化,像几乎所有在Javaland,是标准化。所以,你 可能 执行器根据这一标准在蟒蛇。然而,Java化格式的设计目的不是用于交叉使用的语言,该序列化格式是紧密联系在一起的方式表示对象内的JVM。同时实施一个JVM在蟒蛇当然是一个有趣的锻炼,它可能不是你要找的(-:

还有其他的(数据)化格式,是专门设计的语言无关。他们通常的工作通过剥离的数据格式下降到最低限度(数字、字符串序、字典,就是这样),因此要求一位工作的两端上来表示一个丰富的物体作为一个图表的愚蠢的数据结构(反之亦然)。

就是两个例子 JSON(JavaScript对象符号)其(其是不是标记语言).

ASN。1(抽象语法符号的一个) 是另一个数据序列化格式。而不是方法简化的格式,下一个点,在那里它可以很容易地理解,ASN。1是自我描述的,这意味着所有需要的信息流进行解码进行编码内流本身。

并且,当然, XML(可扩展标记语言), 将工作,提供它不是只是用来提供的文字表述的"存储器转储"的Java的对象,而是一个实际的抽象、语言无关的编码。

因此,为了使一个很长的故事短:你最好的赌注是试图强迫log4j入记录,在一个上面提到的格式、替代log4j的东西,这并,或试图以某种方式拦截的对象之前,它们发送的电线,并将其转换之前离开Javaland.

库,执行式,其中,ASN.1及XML可用于Java和Python(几乎每种编程语言已知的人)。

我将建议移到第三方的格式(通过创建自己的log4j适配器等),这两种语言的了解和可以很容易地元帅/解组,例如XML。

在理论上是可能的。现在如何困难实际上它可能取决于是否Java化格式记录,或者不。我猜,不是这样的。 编辑: 哎呀,我是错的,谢谢查尔斯.

无论如何,这是什么我建议你这样做

  1. 捕获从log4j&deserialize Java object在自己的小Java程序。

  2. 现在,当你有对象再次serialize它使用自己定格式化程序。

    提示: 也许你甚至没有编写自己定格式化程序。例如, JSON(下滚动对库) 具有图书馆Python和Java,所以你可以在理论上使用Java库serialize你的目的和Python相当于库deserialize它

  3. 发送出流向python应用程序和deserialize它

查理写道:

问题是,为了这个 的工作,你的"小java程序" 需要载的相同版本的所有 相同的类别,这可能 deserialize.这是非常棘手的如果你 接收志消息从一个程序, 真的非常棘手的如果你 多路复用多于一个日志的流。无论哪种方式,它不是一个 小小的程序的任何更多。

你不能只是简单地参照Java log4j库在你自己的java进程?我只是给予一般咨询意见,在这里,适用于任何对种语言(名称的问题是漂亮的语言无关,所以我仅仅是提供一个通用的解决办法)。无论如何,我不熟悉log4j并不知道您是否可以"注"你自己的程序进去。如果你可以的,那么当然是你的建议是更好的和更清洁。

嗯,我不Python专家,所以我不能评论有关如何解决你的问题,但是如果你有的程序。净你可以使用IKVM.NET 到deserialize Java objects容易。我已经尝试通过创造。净客户Log4J日志信息写入座存放器和它的工作真的很好。

我很抱歉,如果这个答案是没有道理在这里。

如果你可以有一个JVM在接收方和类定义为所列化的数据,你只需要使用蟒蛇并没有其他语言,然后你可以使用Script:

  • 你会deserialize什么你收到使用正确的Java方法
  • 然后你过程你得到什么与你的代码
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top