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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.apache.log4j.rewrite;
19 import org.apache.log4j.Appender;
20 import org.apache.log4j.AppenderSkeleton;
21 import org.apache.log4j.helpers.AppenderAttachableImpl;
22 import org.apache.log4j.spi.AppenderAttachable;
23 import org.apache.log4j.spi.LoggingEvent;
24 import org.apache.log4j.spi.OptionHandler;
25 import org.apache.log4j.xml.UnrecognizedElementHandler;
26 import org.w3c.dom.Element;
28 import java.util.Enumeration;
29 import java.util.Properties;
32 * This appender forwards a logging request to another
33 * appender after possibly rewriting the logging event.
35 * This appender (with the appropriate policy)
36 * replaces the MapFilter, PropertyFilter and ReflectionFilter
39 public class RewriteAppender extends AppenderSkeleton
40 implements AppenderAttachable, UnrecognizedElementHandler {
44 private RewritePolicy policy;
48 private final AppenderAttachableImpl appenders;
50 public RewriteAppender() {
51 appenders = new AppenderAttachableImpl();
57 protected void append(final LoggingEvent event) {
58 LoggingEvent rewritten = event;
60 rewritten = policy.rewrite(event);
62 if (rewritten != null) {
63 synchronized (appenders) {
64 appenders.appendLoopOnAppenders(rewritten);
72 * @param newAppender appender to add, may not be null.
74 public void addAppender(final Appender newAppender) {
75 synchronized (appenders) {
76 appenders.addAppender(newAppender);
81 * Get iterator over attached appenders.
82 * @return iterator or null if no attached appenders.
84 public Enumeration getAllAppenders() {
85 synchronized (appenders) {
86 return appenders.getAllAppenders();
91 * Get appender by name.
93 * @param name name, may not be null.
94 * @return matching appender or null.
96 public Appender getAppender(final String name) {
97 synchronized (appenders) {
98 return appenders.getAppender(name);
104 * Close this <code>AsyncAppender</code> by interrupting the dispatcher
105 * thread which will process all pending events before exiting.
107 public void close() {
110 // close all attached appenders.
112 synchronized (appenders) {
113 Enumeration iter = appenders.getAllAppenders();
116 while (iter.hasMoreElements()) {
117 Object next = iter.nextElement();
119 if (next instanceof Appender) {
120 ((Appender) next).close();
128 * Determines if specified appender is attached.
129 * @param appender appender.
130 * @return true if attached.
132 public boolean isAttached(final Appender appender) {
133 synchronized (appenders) {
134 return appenders.isAttached(appender);
141 public boolean requiresLayout() {
146 * Removes and closes all attached appenders.
148 public void removeAllAppenders() {
149 synchronized (appenders) {
150 appenders.removeAllAppenders();
155 * Removes an appender.
156 * @param appender appender to remove.
158 public void removeAppender(final Appender appender) {
159 synchronized (appenders) {
160 appenders.removeAppender(appender);
165 * Remove appender by name.
168 public void removeAppender(final String name) {
169 synchronized (appenders) {
170 appenders.removeAppender(name);
175 public void setRewritePolicy(final RewritePolicy rewritePolicy) {
176 policy = rewritePolicy;
181 public boolean parseUnrecognizedElement(final Element element,
182 final Properties props) throws Exception {
183 final String nodeName = element.getNodeName();
184 if ("rewritePolicy".equals(nodeName)) {
185 Object rewritePolicy =
186 org.apache.log4j.xml.DOMConfigurator.parseElement(
187 element, props, RewritePolicy.class);
188 if (rewritePolicy != null) {
189 if (rewritePolicy instanceof OptionHandler) {
190 ((OptionHandler) rewritePolicy).activateOptions();
192 this.setRewritePolicy((RewritePolicy) rewritePolicy);