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 org.apache.log4j.Logger; 20 import org.apache.log4j.spi.LoggingEvent; 21 22 import java.util.HashMap; 23 import java.util.Map; 24 25 /** 26 * This policy rewrites events where the message of the 27 * original event implementes java.util.Map. 28 * All other events are passed through unmodified. 29 * If the map contains a "message" entry, the value will be 30 * used as the message for the rewritten event. The rewritten 31 * event will have a property set that is the combination of the 32 * original property set and the other members of the message map. 33 * If both the original property set and the message map 34 * contain the same entry, the value from the message map 35 * will overwrite the original property set. 36 * <p> 37 * The combination of the RewriteAppender and this policy 38 * performs the same actions as the MapFilter from log4j 1.3. 39 */ 40 public class MapRewritePolicy implements RewritePolicy { 41 /** 42 * {@inheritDoc} 43 */ 44 public LoggingEvent rewrite(final LoggingEvent source) { 45 Object msg = source.getMessage(); 46 if (msg instanceof Map) { 47 Map props = new HashMap(source.getProperties()); 48 Map eventProps = (Map) msg; 49 // 50 // if the map sent in the logging request 51 // has "message" entry, use that as the message body 52 // otherwise, use the entire map. 53 // 54 Object newMsg = eventProps.get("message"); 55 if (newMsg == null) { 56 newMsg = msg; 57 } 58 59 for (Object o : eventProps.entrySet()) { 60 Map.Entry entry = (Map.Entry) o; 61 if (!("message".equals(entry.getKey()))) { 62 props.put(entry.getKey(), entry.getValue()); 63 } 64 } 65 66 return new LoggingEvent( 67 source.getFQNOfLoggerClass(), 68 source.getLogger() != null ? source.getLogger() : Logger.getLogger(source.getLoggerName()), 69 source.getTimeStamp(), 70 source.getLevel(), 71 newMsg, 72 source.getThreadName(), 73 source.getThrowableInformation(), 74 source.getNDC(), 75 source.getLocationInformation(), 76 props); 77 } else { 78 return source; 79 } 80 81 } 82 }