Log4j1.x LoggingEnvent:无法获取Object

时间:2015-03-06 14:31:46

标签: java sockets serialization log4j instanceof

我使用Log4j1.x通过Socket(AsyncAppender中的SocketAppender)发送一些loggingEvent。

我在LoggingEvent消息中发送个人对象Serializable。

在Chainsaw(服务器范围的例子)中,我想恢复我的个人对象。

  • 我可以显示类名(event.getMessage()。toString())
  • 我可以得到扔掉的
  • 我的个人对象在一个库中,两个项目都是一样的。

我的问题:我不能实例化消息。

错误:

Exception in thread "Thread-5" java.lang.ClassCastException: java.lang.String cannot be cast to com.my.MyPersonnalObject
    at org.apache.log4j.chainsaw.LoggingReceiver$Slurper.run(LoggingReceiver.java:80)
    at java.lang.Thread.run(Unknown Source)

我如何重新保护我的物体?

谢谢,

1 个答案:

答案 0 :(得分:0)

我找到了一个简单的方法。

重写MyPersonnalObject的toString以返回JSON值:

@Override
public String toString()
{
    String str = "";
    try
    {
        str = objectMapper.writeValueAsString(this);
    } catch (JsonProcessingException e)
    {
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        str = "ERROR JSON" + errors.toString();
    }
    return str;
}

然后,在另一边,使用:

public static MyPersonnalObject rescure(String jsonStr)
{
    MyPersonnalObject b = null;

    try
    {
        JsonParser jsonParser = jsonFactory.createParser(jsonStr);
        b = objectMapper.readValue(jsonParser, MyPersonnalObject.class);

    } catch (JsonParseException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    return b;
}