Hi,
we found a bug in log4J 2.0 Beta4:
We configured a SocketAppender with a reconnectionDelay and defaultLayout
(SerializedLayout) in a XML-Config File.
After starting the application, the SocketAppender tries to open the socket
periodical.
As the next step, we start the application with the SocketServer, and so the
Appender connects to it.
But after we get the following Exception, when we will open the
ObjectInputStream (final ObjectInputStream ois = new
ObjectInputStream(socket.getInputStream());
Exception in thread "Thread-2" java.lang.RuntimeException:
java.io.StreamCorruptedException: invalid stream header: 7372003E
at test.logger.LoggerTest_1$TCPSocketServer.run(LoggerTest_1.java:83)
Caused by: java.io.StreamCorruptedException: invalid stream header: 7372003E
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at test.logger.LoggerTest_1$TCPSocketServer.run(LoggerTest_1.java:72)
The reason is:
At the Startup is no socket server available, therefore a dummy
ByteArrayOutputStream is created.
See TCPSocketManager:230
After that, the Header of the layout (Object stream header) is written to the
Dummy ByteArrayOutputStream.
See AbstractOutputStreamAppender:62
If the Reconnector-Thread succeeds, the Dummy ByteArrayOutputStream is changed
to the OutputStream from the socket.
See TCPSocketManager:175
But after this action the object stream header is not written again!
Kind regards
WG