LoggingEvent.formattedMessage is only initialized if message and arguments are supplied during construction. If the default c'tor is used and message and arguments are provided using setMessage and setArgumentArray then formattedMessage will stay null.
Instead, formattedMessage should be declared transient and the actual formatting should take place lazily during getFormattedMessage call.
This would fix this problem, would increase general logging performance (formatting only if actually needed) and would decrease the size of serialized log events significantly while it would not change anything from the callers point of view.
This is a follow-up of