| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.log4j.rewrite; |
| |
| import org.apache.log4j.Appender; |
| import org.apache.log4j.AppenderSkeleton; |
| import org.apache.log4j.helpers.AppenderAttachableImpl; |
| import org.apache.log4j.spi.AppenderAttachable; |
| import org.apache.log4j.spi.LoggingEvent; |
| import org.apache.log4j.spi.OptionHandler; |
| import org.apache.log4j.xml.UnrecognizedElementHandler; |
| import org.w3c.dom.Element; |
| |
| import java.util.Enumeration; |
| import java.util.Properties; |
| |
| /** |
| * This appender forwards a logging request to another |
| * appender after possibly rewriting the logging event. |
| * |
| * This appender (with the appropriate policy) |
| * replaces the MapFilter, PropertyFilter and ReflectionFilter |
| * from log4j 1.3. |
| */ |
| public class RewriteAppender extends AppenderSkeleton |
| implements AppenderAttachable, UnrecognizedElementHandler { |
| /** |
| * Rewrite policy. |
| */ |
| private RewritePolicy policy; |
| /** |
| * Nested appenders. |
| */ |
| private final AppenderAttachableImpl appenders; |
| |
| public RewriteAppender() { |
| appenders = new AppenderAttachableImpl(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| protected void append(final LoggingEvent event) { |
| LoggingEvent rewritten = event; |
| if (policy != null) { |
| rewritten = policy.rewrite(event); |
| } |
| if (rewritten != null) { |
| synchronized (appenders) { |
| appenders.appendLoopOnAppenders(rewritten); |
| } |
| } |
| } |
| |
| /** |
| * Add appender. |
| * |
| * @param newAppender appender to add, may not be null. |
| */ |
| public void addAppender(final Appender newAppender) { |
| synchronized (appenders) { |
| appenders.addAppender(newAppender); |
| } |
| } |
| |
| /** |
| * Get iterator over attached appenders. |
| * @return iterator or null if no attached appenders. |
| */ |
| public Enumeration getAllAppenders() { |
| synchronized (appenders) { |
| return appenders.getAllAppenders(); |
| } |
| } |
| |
| /** |
| * Get appender by name. |
| * |
| * @param name name, may not be null. |
| * @return matching appender or null. |
| */ |
| public Appender getAppender(final String name) { |
| synchronized (appenders) { |
| return appenders.getAppender(name); |
| } |
| } |
| |
| |
| /** |
| * Close this <code>AsyncAppender</code> by interrupting the dispatcher |
| * thread which will process all pending events before exiting. |
| */ |
| public void close() { |
| closed = true; |
| // |
| // close all attached appenders. |
| // |
| synchronized (appenders) { |
| Enumeration iter = appenders.getAllAppenders(); |
| |
| if (iter != null) { |
| while (iter.hasMoreElements()) { |
| Object next = iter.nextElement(); |
| |
| if (next instanceof Appender) { |
| ((Appender) next).close(); |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * Determines if specified appender is attached. |
| * @param appender appender. |
| * @return true if attached. |
| */ |
| public boolean isAttached(final Appender appender) { |
| synchronized (appenders) { |
| return appenders.isAttached(appender); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public boolean requiresLayout() { |
| return false; |
| } |
| |
| /** |
| * Removes and closes all attached appenders. |
| */ |
| public void removeAllAppenders() { |
| synchronized (appenders) { |
| appenders.removeAllAppenders(); |
| } |
| } |
| |
| /** |
| * Removes an appender. |
| * @param appender appender to remove. |
| */ |
| public void removeAppender(final Appender appender) { |
| synchronized (appenders) { |
| appenders.removeAppender(appender); |
| } |
| } |
| |
| /** |
| * Remove appender by name. |
| * @param name name. |
| */ |
| public void removeAppender(final String name) { |
| synchronized (appenders) { |
| appenders.removeAppender(name); |
| } |
| } |
| |
| |
| public void setRewritePolicy(final RewritePolicy rewritePolicy) { |
| policy = rewritePolicy; |
| } |
| /** |
| * {@inheritDoc} |
| */ |
| public boolean parseUnrecognizedElement(final Element element, |
| final Properties props) throws Exception { |
| final String nodeName = element.getNodeName(); |
| if ("rewritePolicy".equals(nodeName)) { |
| Object rewritePolicy = |
| org.apache.log4j.xml.DOMConfigurator.parseElement( |
| element, props, RewritePolicy.class); |
| if (rewritePolicy != null) { |
| if (rewritePolicy instanceof OptionHandler) { |
| ((OptionHandler) rewritePolicy).activateOptions(); |
| } |
| this.setRewritePolicy((RewritePolicy) rewritePolicy); |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| } |