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.beans.Introspector;
20  import java.beans.PropertyDescriptor;
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  import org.apache.log4j.Logger;
25  import org.apache.log4j.helpers.LogLog;
26  import org.apache.log4j.spi.LoggingEvent;
27  
28  /**
29   * This policy rewrites events by evaluating any
30   * JavaBean properties on the message object and adding them
31   * to the event properties.  If the message object has a
32   * message property, the value of that property will be
33   * used as the message for the rewritten event and will
34   * not be added to the event properties.  Values from the
35   * JavaBean properties will replace any existing property
36   * with the same name.
37   *
38   * The combination of the RewriteAppender and this policy
39   * performs the same actions as the ReflectionFilter from log4j 1.3. 
40   */
41  public class ReflectionRewritePolicy implements RewritePolicy {
42      /**
43       * {@inheritDoc}
44       */
45      public LoggingEvent rewrite(final LoggingEvent source) {
46          Object msg = source.getMessage();
47          if (!(msg instanceof String)) {
48              Object newMsg = msg;
49              Map rewriteProps = new HashMap(source.getProperties());
50  
51              try {
52                  PropertyDescriptor[] props = Introspector.getBeanInfo(
53                          msg.getClass(), Object.class).getPropertyDescriptors();
54                  if (props.length > 0) {
55                      for (int i=0;i<props.length;i++) {
56                          try {
57                              Object propertyValue =
58                                  props[i].getReadMethod().invoke(msg,
59                                          (Object[]) null);
60                              if ("message".equalsIgnoreCase(props[i].getName())) {
61                                  newMsg = propertyValue;
62                              } else {
63                                  rewriteProps.put(props[i].getName(), propertyValue);
64                              }
65                          } catch (Exception e) {
66                              LogLog.warn("Unable to evaluate property " +
67                                      props[i].getName(), e);
68                          }
69                      }
70                      return new LoggingEvent(
71                              source.getFQNOfLoggerClass(),
72                              source.getLogger() != null ? source.getLogger(): Logger.getLogger(source.getLoggerName()),
73                              source.getTimeStamp(),
74                              source.getLevel(),
75                              newMsg,
76                              source.getThreadName(),
77                              source.getThrowableInformation(),
78                              source.getNDC(),
79                              source.getLocationInformation(),
80                              rewriteProps);
81                  }
82              } catch (Exception e) {
83                  LogLog.warn("Unable to get property descriptors", e);
84              }
85  
86          }
87          return source;
88      }
89  }