View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.log4j.rewrite;
    18
    19  import java.util.HashMap;
    20  import java.util.Iterator;
    21  import java.util.Map;
    22
    23  import org.apache.log4j.Logger;
    24  import org.apache.log4j.spi.LoggingEvent;
    25
    26  /**
    27   * This policy rewrites events where the message of the
    28   * original event implementes java.util.Map.
    29   * All other events are passed through unmodified.
    30   * If the map contains a "message" entry, the value will be
    31   * used as the message for the rewritten event.  The rewritten
    32   * event will have a property set that is the combination of the
    33   * original property set and the other members of the message map.
    34   * If both the original property set and the message map
    35   * contain the same entry, the value from the message map
    36   * will overwrite the original property set.
    37   *
    38   * The combination of the RewriteAppender and this policy
    39   * performs the same actions as the MapFilter from log4j 1.3.
    40   */
    41  public class MapRewritePolicy implements RewritePolicy {
    42      /**
    43       * {@inheritDoc}
    44       */
    45      public LoggingEvent rewrite(final LoggingEvent source) {
    46          Object msg = source.getMessage();
    47          if (msg instanceof Map) {
    48              Map props = new HashMap(source.getProperties());
    49              Map eventProps = (Map) msg;
    50              //
    51              //   if the map sent in the logging request
    52              //      has "message" entry, use that as the message body
    53              //      otherwise, use the entire map.
    54              //
    55              Object newMsg = eventProps.get("message");
    56              if (newMsg == null) {
    57                  newMsg = msg;
    58              }
    59
    60              for(Iterator iter = eventProps.entrySet().iterator();
    61                      iter.hasNext();
    62                    ) {
    63                  Map.Entry entry = (Map.Entry) iter.next();
    64                  if (!("message".equals(entry.getKey()))) {
    65                      props.put(entry.getKey(), entry.getValue());
    66                  }
    67              }
    68
    69              return new LoggingEvent(
    70                      source.getFQNOfLoggerClass(),
    71                      source.getLogger() != null ? source.getLogger(): Logger.getLogger(source.getLoggerName()),
    72                      source.getTimeStamp(),
    73                      source.getLevel(),
    74                      newMsg,
    75                      source.getThreadName(),
    76                      source.getThrowableInformation(),
    77                      source.getNDC(),
    78                      source.getLocationInformation(),
    79                      props);
    80          } else {
    81              return source;
    82          }
    83
    84      }
    85  }