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.logging.log4j.core.jmx;
18
19 import java.util.Objects;
20
21 import javax.management.ObjectName;
22
23 import org.apache.logging.log4j.core.appender.AsyncAppender;
24
25 /**
26 * Implementation of the {@code AsyncAppenderAdminMBean} interface.
27 */
28 public class AsyncAppenderAdmin implements AsyncAppenderAdminMBean {
29
30 private final String contextName;
31 private final AsyncAppender asyncAppender;
32 private final ObjectName objectName;
33
34 /**
35 * Constructs a new {@code AsyncAppenderAdmin} with the specified contextName
36 * and async appender.
37 *
38 * @param contextName used in the {@code ObjectName} for this mbean
39 * @param appender the instrumented object
40 */
41 public AsyncAppenderAdmin(final String contextName, final AsyncAppender appender) {
42 // super(executor); // no notifications for now
43 this.contextName = Objects.requireNonNull(contextName, "contextName");
44 this.asyncAppender = Objects.requireNonNull(appender, "async appender");
45 try {
46 final String ctxName = Server.escape(this.contextName);
47 final String configName = Server.escape(appender.getName());
48 final String name = String.format(PATTERN, ctxName, configName);
49 objectName = new ObjectName(name);
50 } catch (final Exception e) {
51 throw new IllegalStateException(e);
52 }
53 }
54
55 /**
56 * Returns the {@code ObjectName} of this mbean.
57 *
58 * @return the {@code ObjectName}
59 * @see AppenderAdminMBean#PATTERN
60 */
61 public ObjectName getObjectName() {
62 return objectName;
63 }
64
65 @Override
66 public String getName() {
67 return asyncAppender.getName();
68 }
69
70 @Override
71 public String getLayout() {
72 return String.valueOf(asyncAppender.getLayout());
73 }
74
75 @Override
76 public boolean isIgnoreExceptions() {
77 return asyncAppender.ignoreExceptions();
78 }
79
80 @Override
81 public String getErrorHandler() {
82 return String.valueOf(asyncAppender.getHandler());
83 }
84
85 @Override
86 public String getFilter() {
87 return String.valueOf(asyncAppender.getFilter());
88 }
89
90 @Override
91 public String[] getAppenderRefs() {
92 return asyncAppender.getAppenderRefStrings();
93 }
94
95 /**
96 * Returns {@code true} if this AsyncAppender will take a snapshot of the stack with
97 * every log event to determine the class and method where the logging call
98 * was made.
99 * @return {@code true} if location is included with every event, {@code false} otherwise
100 */
101 @Override
102 public boolean isIncludeLocation() {
103 return asyncAppender.isIncludeLocation();
104 }
105
106 /**
107 * Returns {@code true} if this AsyncAppender will block when the queue is full,
108 * or {@code false} if events are dropped when the queue is full.
109 * @return whether this AsyncAppender will block or drop events when the queue is full.
110 */
111 @Override
112 public boolean isBlocking() {
113 return asyncAppender.isBlocking();
114 }
115
116 /**
117 * Returns the name of the appender that any errors are logged to or {@code null}.
118 * @return the name of the appender that any errors are logged to or {@code null}
119 */
120 @Override
121 public String getErrorRef() {
122 return asyncAppender.getErrorRef();
123 }
124
125 @Override
126 public int getQueueCapacity() {
127 return asyncAppender.getQueueCapacity();
128 }
129
130 @Override
131 public int getQueueRemainingCapacity() {
132 return asyncAppender.getQueueRemainingCapacity();
133 }
134 }