Uploaded image for project: 'Log4j 2'
  1. Log4j 2
  2. LOG4J2-1510

why MutableLogEvent don't keep original log object or even the ReusableObjectMessage

    Details

    • Type: Question
    • Status: Closed
    • Priority: Blocker
    • Resolution: Fixed
    • Affects Version/s: 2.6.2
    • Fix Version/s: None
    • Component/s: Core
    • Labels:
      None

      Description

      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 though 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;
          }
      

      If I use the ReusableMessageFactory and ReusableLogEventFactory, then when I send out an object though API, it seems impossible to get it from MutableLogEvent.

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

      Best reagrds.

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              maple.feng.wang@hotmail.com Maple Wang
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: