001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017 package org.apache.logging.log4j.core.appender.routing;
018
019 import org.apache.logging.log4j.Logger;
020 import org.apache.logging.log4j.core.config.Node;
021 import org.apache.logging.log4j.core.config.plugins.Plugin;
022 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
023 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
024 import org.apache.logging.log4j.core.config.plugins.PluginNode;
025 import org.apache.logging.log4j.status.StatusLogger;
026
027 /**
028 * A Route to an appender.
029 */
030 @Plugin(name = "Route", category = "Core", printObject = true, deferChildren = true)
031 public final class Route {
032 private static final Logger LOGGER = StatusLogger.getLogger();
033
034 private final Node node;
035 private final String appenderRef;
036 private final String key;
037
038 private Route(final Node node, final String appenderRef, final String key) {
039 this.node = node;
040 this.appenderRef = appenderRef;
041 this.key = key;
042 }
043
044 /**
045 * Returns the Dynamic Appender Node.
046 * @return The Node.
047 */
048 public Node getNode() {
049 return node;
050 }
051
052 /**
053 * Returns the appender reference.
054 * @return The Appender reference.
055 */
056 public String getAppenderRef() {
057 return appenderRef;
058 }
059
060 /**
061 * Returns the key for this Route.
062 * @return the key for this Route.
063 */
064 public String getKey() {
065 return key;
066 }
067
068 @Override
069 public String toString() {
070 final StringBuilder sb = new StringBuilder("Route(");
071 sb.append("type=");
072 if (appenderRef != null) {
073 sb.append("static Reference=").append(appenderRef);
074 } else if (node != null) {
075 sb.append("dynamic - type=").append(node.getName());
076 } else {
077 sb.append("invalid Route");
078 }
079 if (key != null) {
080 sb.append(" key='").append(key).append('\'');
081 } else {
082 sb.append(" default");
083 }
084 sb.append(')');
085 return sb.toString();
086 }
087
088 /**
089 * Create the Route.
090 * @param appenderRef The Appender reference.
091 * @param key The key.
092 * @param node The Node.
093 * @return A Route.
094 */
095 @PluginFactory
096 public static Route createRoute(
097 @PluginAttribute("ref") final String appenderRef,
098 @PluginAttribute("key") final String key,
099 @PluginNode final Node node) {
100 if (node != null && node.hasChildren()) {
101 if (appenderRef != null) {
102 LOGGER.error("A route cannot be configured with an appender reference and an appender definition");
103 return null;
104 }
105 } else {
106 if (appenderRef == null) {
107 LOGGER.error("A route must specify an appender reference or an appender definition");
108 return null;
109 }
110 }
111 return new Route(node, appenderRef, key);
112 }
113 }