Hi,

After upgrading Log4j from 2.5 to 2.6.2, I found that log event catched by my 
appender is changed from Log4jLogEvent to MutableLogEvent, it's fine except 
that I can't get the ObjectMessage from MutableLogEvent. If I sent object 
message thought log4j API like log.info(object);, I assume object can be 
obtained in ReusableObjectMessage, but since MutableLogEvent look like don't 
keep it as below:

public void setMessage(final Message msg) {
        if (msg instanceof ReusableMessage) {
            final ReusableMessage reusable = (ReusableMessage) msg;
            reusable.formatTo(getMessageTextForWriting());
            if (parameters != null) {
                parameters = reusable.swapParameters(parameters);
                parameterCount = reusable.getParameterCount();
            }
        } else {
            // if the Message instance is reused, there is no point in freezing 
its message here
            if (!Constants.FORMAT_MESSAGES_IN_BACKGROUND && msg != null) { // 
LOG4J2-898: user may choose
                msg.getFormattedMessage(); // LOG4J2-763: ask message to freeze 
parameters
            }
            this.message = msg;
        }
}

So ,  when I call the getMessage from MutableLogEvent like below, I only can 
get the instance of MutableLogEvent itself.

public Message getMessage() {
        if (message == null) {
            return (messageText == null) ? EMPTY : this;
        }
        return message;
    }

I know I can use other MessageFactory to bypass it, but why MutableLogEvent 
don't keep the ReusableObjectMessage, is that on purpose? Is there other way to 
get the ReusableObjectMessage from MutableLogEvent?

Best reagrds.

Reply via email to