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.builders.appender;
18  
19  import org.apache.log4j.Appender;
20  import org.apache.log4j.bridge.AppenderWrapper;
21  import org.apache.log4j.bridge.RewritePolicyAdapter;
22  import org.apache.log4j.bridge.RewritePolicyWrapper;
23  import org.apache.log4j.builders.AbstractBuilder;
24  import org.apache.log4j.builders.Holder;
25  import org.apache.log4j.config.Log4j1Configuration;
26  import org.apache.log4j.config.PropertiesConfiguration;
27  import org.apache.log4j.helpers.OptionConverter;
28  import org.apache.log4j.rewrite.RewritePolicy;
29  import org.apache.log4j.spi.Filter;
30  import org.apache.log4j.xml.XmlConfiguration;
31  import org.apache.logging.log4j.Logger;
32  import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
33  import org.apache.logging.log4j.core.config.AppenderRef;
34  import org.apache.logging.log4j.core.config.plugins.Plugin;
35  import org.apache.logging.log4j.status.StatusLogger;
36  import org.w3c.dom.Element;
37  
38  import java.util.ArrayList;
39  import java.util.List;
40  import java.util.Properties;
41  
42  import static org.apache.log4j.builders.BuilderManager.CATEGORY;
43  import static org.apache.log4j.config.Log4j1Configuration.APPENDER_REF_TAG;
44  import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
45  import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
46  import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
47  import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
48  import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
49  import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
50  
51  
52  /**
53   * Build an Asynch Appender
54   */
55  @Plugin(name = "org.apache.log4j.rewrite.RewriteAppender", category = CATEGORY)
56  public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderBuilder {
57  
58      private static final Logger LOGGER = StatusLogger.getLogger();
59      private static final String REWRITE_POLICY_TAG = "rewritePolicy";
60  
61      public RewriteAppenderBuilder() {
62      }
63  
64      public RewriteAppenderBuilder(String prefix, Properties props) {
65          super(prefix, props);
66      }
67  
68      @Override
69      public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
70          String name = appenderElement.getAttribute(NAME_ATTR);
71          Holder<List<String>> appenderRefs = new Holder<>(new ArrayList<>());
72          Holder<RewritePolicy> rewritePolicyHolder = new Holder<>();
73          Holder<String> level = new Holder<>();
74          Holder<Filter> filter = new Holder<>();
75          forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
76              switch (currentElement.getTagName()) {
77                  case APPENDER_REF_TAG:
78                      Appender appender = config.findAppenderByReference(currentElement);
79                      if (appender != null) {
80                          appenderRefs.get().add(appender.getName());
81                      }
82                      break;
83                  case REWRITE_POLICY_TAG: {
84                      RewritePolicy policy = config.parseRewritePolicy(currentElement);
85                      if (policy != null) {
86                          rewritePolicyHolder.set(policy);
87                      }
88                      break;
89                  }
90                  case FILTER_TAG: {
91                      filter.set(config.parseFilters(currentElement));
92                      break;
93                  }
94                  case PARAM_TAG: {
95                      if (currentElement.getAttribute(NAME_ATTR).equalsIgnoreCase(THRESHOLD_PARAM)) {
96                          String value = currentElement.getAttribute(VALUE_ATTR);
97                          if (value == null) {
98                              LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
99                          } else {
100                             level.set(value);
101                         }
102                     }
103                     break;
104                 }
105             }
106         });
107         return createAppender(name, level.get(), appenderRefs.get().toArray(new String[0]), rewritePolicyHolder.get(),
108                 filter.get(), config);
109     }
110 
111     @Override
112     public Appender parseAppender(final String name, final String appenderPrefix, final String layoutPrefix,
113             final String filterPrefix, final Properties props, final PropertiesConfiguration configuration) {
114         String appenderRef = getProperty(APPENDER_REF_TAG);
115         Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
116         String policyPrefix = appenderPrefix + ".rewritePolicy";
117         String className = getProperty(policyPrefix);
118         RewritePolicy policy = configuration.getBuilderManager().parseRewritePolicy(className, policyPrefix,
119                 props, configuration);
120         String level = getProperty(THRESHOLD_PARAM);
121         if (appenderRef == null) {
122             LOGGER.warn("No appender references configured for AsyncAppender {}", name);
123             return null;
124         }
125         Appender appender = configuration.parseAppender(props, appenderRef);
126         if (appender == null) {
127             LOGGER.warn("Cannot locate Appender {}", appenderRef);
128             return null;
129         }
130         return createAppender(name, level, new String[] {appenderRef}, policy, filter, configuration);
131     }
132 
133     private <T extends Log4j1Configuration> Appender createAppender(String name, String level,
134             String[] appenderRefs, RewritePolicy policy, Filter filter, T configuration) {
135         org.apache.logging.log4j.Level logLevel = OptionConverter.convertLevel(level,
136                 org.apache.logging.log4j.Level.TRACE);
137         AppenderRef[] refs = new AppenderRef[appenderRefs.length];
138         int index = 0;
139         for (String appenderRef : appenderRefs) {
140             refs[index++] = AppenderRef.createAppenderRef(appenderRef, logLevel, null);
141         }
142         org.apache.logging.log4j.core.Filter rewriteFilter = buildFilters(level, filter);
143         org.apache.logging.log4j.core.appender.rewrite.RewritePolicy rewritePolicy;
144         if (policy instanceof RewritePolicyWrapper) {
145             rewritePolicy = ((RewritePolicyWrapper) policy).getPolicy();
146         } else {
147             rewritePolicy = new RewritePolicyAdapter(policy);
148         }
149         return new AppenderWrapper(RewriteAppender.createAppender(name, "true", refs, configuration,
150                 rewritePolicy, rewriteFilter));
151     }
152 }