Pregunta

El log4j adaptador de red envía los eventos como un serializado objeto de java.Me gustaría ser capaz de captar este objeto y deserialise en un idioma diferente (en python).Es esto posible?

NOTA La captura de red es fácil;es sólo un socket TCP y de la lectura en un arroyo.La dificultad es la deserialising parte

¿Fue útil?

Solución

En general, no.

El formato de la secuencia para la serialización de Java se define en este documento, pero usted necesita el acceso a los originales de las definiciones de clase (y un tiempo de ejecución de Java para cargar) para activar la secuencia de datos en algo que se aproxima a los objetos originales.Por ejemplo, las clases pueden definir writeObject() y readObject() métodos para personalizar su propia forma serializada.

(editar: lubos hasko sugiere tener un poco de java programa para deserializar los objetos en frente de Python, pero el problema es que para que esto funcione, su "pequeño programa en java" de las necesidades de carga de las mismas versiones de todos a las mismas clases que podría deserializar.Lo cual es difícil si usted está recibiendo mensajes de registro de una aplicación, y realmente difícil si eres de multiplexación más de una secuencia de registro.De cualquier manera, no va a ser un poco de todo. edit2: Yo podría estar equivocado, no sé lo que se serializan.Si es sólo log4j clases debe estar bien.Por otro lado, es posible iniciar sesión arbitraria excepciones, y si se meten en la corriente así que mi punto está de pie.)

Sería mucho más fácil personalizar el log4j adaptador de red y reemplazar el crudo de serialización con algunos más fácilmente-deserializa forma (por ejemplo, usted podría usar XStream para convertir el objeto en una representación XML)

Otros consejos

Teóricamente, es posible.La Serialización de Java, como casi todo en Javaland, está estandarizado.Así que, usted podría implementar un deserializer de acuerdo con ese estándar de Python.Sin embargo, el formato de Serialización de Java no está diseñado para la cruz de uso del idioma, el formato de serialización está estrechamente ligado a la forma en que los objetos están representados dentro de la JVM.Mientras que la implementación de una JVM en Python es sin duda un ejercicio divertido, probablemente no sea lo que estás buscando (-:

Hay otros (datos) formatos de serialización que están diseñados específicamente para ser independiente del idioma.Que suelen trabajar por la eliminación de los formatos de datos de abajo del mínimo (número, una cadena, de la secuencia, diccionario y eso es todo) y por tanto requieren de un poco de trabajo en ambos extremos para representar una rica objeto como un gráfico de tonto estructuras de datos (y viceversa).

Dos ejemplos son JSON (JavaScript Object Notation) y YAML (YAML Ain't Markup Language).

ASN.1 (Abstract Syntax Notation One) es otro de los datos formato de serialización.En lugar de banalización el formato de abajo a un punto donde puede ser fácilmente entendido, ASN.1 es la auto-descripción, es decir, toda la información necesaria para decodificar la secuencia está codificada dentro de la propia secuencia.

Y, por supuesto, XML (eXtensible Markup Language), será trabajar demasiado, a condición de que no sólo se utiliza para proporcionar representación textual de un "volcado de memoria" de un objeto Java, pero un real abstractos, independientes del lenguaje de codificación.

Entonces, para hacer una larga historia corta:su mejor apuesta es tratar de coaccionar a log4j en el registro en uno de los formatos mencionados, reemplazar log4j con algo que hace o intenta de alguna manera interceptar los objetos antes de que se envía a través del cable y convertirlos antes de salir de Javaland.

Las bibliotecas que implementan JSON, YAML, ASN.1 y XML están disponibles para Java y Python (y casi en cualquier lenguaje de programación conocido por el hombre).

Yo recomendaría mover a un tercero, un formato (por la creación de su propia log4j adaptadores, etc) que los dos idiomas entender y se puede fácilmente mariscal / deserializar, por ejemplo,XML.

En teoría es posible.Ahora lo difícil en la práctica puede ser, depende de si el formato de serialización de Java está documentado o no.Supongo, no lo es. editar: uy, me equivoqué, gracias Carlos.

De todos modos, esto es lo que me sugieren hacer

  1. captura de log4j & deserializar objetos Java en su propio pequeño programa en Java.

  2. ahora, cuando usted tiene el objeto de nuevo, serializar el uso de un formateador personalizado.

    Sugerencia: Tal vez usted ni siquiera tiene que escribir su propio formateador personalizado.por ejemplo, JSON (desplácese hacia abajo para libs) dispone de las librerías para Python y Java, por lo que en teoría podría utilizar la biblioteca de Java para serializar los objetos y Python equivalente de la biblioteca para deserializar es

  3. enviar secuencia de salida para su aplicación python y deserializar es

Charles escribió:

el problema es que, para este para trabajar, el "pequeño programa en java" necesita cargar las mismas versiones de todos las mismas clases que podría deserializar.Lo cual es difícil si usted está la recepción de los mensajes de registro de una aplicación, y realmente difícil si usted está multiplexación de más de una secuencia de registro.De cualquier manera, no va a ser un programa poco más.

No puedes simplemente de referencia de Java log4j las bibliotecas en su propio proceso java?Yo solo te estoy dando consejos generales aquí que es aplicable a cualquier par de idiomas (nombre de la pregunta es bastante independiente del idioma, así que sólo proporciona una de las soluciones genéricas).De todos modos, yo no estoy familiarizado con log4j y no sé si se puede "inyectar" su propia serializador en ella.Si puede, entonces, por supuesto, su sugerencia es mucho mejor y más limpio.

Bueno, yo no soy experto en Python, así que no puedo comentar sobre cómo resolver su problema, pero si usted tiene programa .NET se puede utilizar IKVM.NET para deserializar objetos Java fácilmente.He experimentado esta creando .Cliente de RED para Log4J mensajes de registro por escrito a la toma appender y funcionó realmente bien.

Lo siento, si esta respuesta no tiene sentido aquí.

Si usted puede tener una JVM en el lado de recepción y las definiciones de clase para los datos serializados, y sólo desea usar Python y ningún otro idioma, entonces usted puede utilizar Jython:

  • usted deserializar lo que recibió uso correcto de los métodos Java
  • y luego de procesar lo que usted consigue con usted el código de Python
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top