1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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 }