1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.async;
18
19 import java.util.Arrays;
20 import java.util.List;
21
22 import org.apache.logging.log4j.Level;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.core.Filter;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.AppenderRef;
27 import org.apache.logging.log4j.core.config.Configuration;
28 import org.apache.logging.log4j.core.config.LoggerConfig;
29 import org.apache.logging.log4j.core.config.Property;
30 import org.apache.logging.log4j.core.config.plugins.Plugin;
31 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
32 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
33 import org.apache.logging.log4j.core.config.plugins.PluginElement;
34 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
35 import org.apache.logging.log4j.core.helpers.Booleans;
36 import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @Plugin(name = "asyncLogger", category = "Core", printObject = true)
67 public class AsyncLoggerConfig extends LoggerConfig {
68
69 private AsyncLoggerConfigHelper helper;
70
71
72
73
74 public AsyncLoggerConfig() {
75 super();
76 }
77
78
79
80
81
82
83
84
85 public AsyncLoggerConfig(final String name, final Level level,
86 final boolean additive) {
87 super(name, level, additive);
88 }
89
90 protected AsyncLoggerConfig(final String name,
91 final List<AppenderRef> appenders, final Filter filter,
92 final Level level, final boolean additive,
93 final Property[] properties, final Configuration config,
94 final boolean includeLocation) {
95 super(name, appenders, filter, level, additive, properties, config,
96 includeLocation);
97 }
98
99
100
101
102
103 @Override
104 protected void callAppenders(final LogEvent event) {
105
106 event.getSource();
107 event.getThreadName();
108
109
110 if (!helper.callAppendersFromAnotherThread(event)) {
111 super.callAppenders(event);
112 }
113 }
114
115
116 void asyncCallAppenders(final LogEvent event) {
117 super.callAppenders(event);
118 }
119
120 @Override
121 public void startFilter() {
122 if (helper == null) {
123 helper = new AsyncLoggerConfigHelper(this);
124 } else {
125 AsyncLoggerConfigHelper.claim();
126 }
127 super.startFilter();
128 }
129
130 @Override
131 public void stopFilter() {
132 AsyncLoggerConfigHelper.release();
133 super.stopFilter();
134 }
135
136
137
138
139
140
141
142 public RingBufferAdmin createRingBufferAdmin(String contextName) {
143 return helper.createRingBufferAdmin(contextName, getName());
144 }
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 @PluginFactory
160 public static LoggerConfig createLogger(
161 @PluginAttribute("additivity") final String additivity,
162 @PluginAttribute("level") final String levelName,
163 @PluginAttribute("name") final String loggerName,
164 @PluginAttribute("includeLocation") final String includeLocation,
165 @PluginElement("AppenderRef") final AppenderRef[] refs,
166 @PluginElement("Properties") final Property[] properties,
167 @PluginConfiguration final Configuration config,
168 @PluginElement("Filters") final Filter filter) {
169 if (loggerName == null) {
170 LOGGER.error("Loggers cannot be configured without a name");
171 return null;
172 }
173
174 final List<AppenderRef> appenderRefs = Arrays.asList(refs);
175 Level level;
176 try {
177 level = Level.toLevel(levelName, Level.ERROR);
178 } catch (final Exception ex) {
179 LOGGER.error(
180 "Invalid Log level specified: {}. Defaulting to Error",
181 levelName);
182 level = Level.ERROR;
183 }
184 final String name = loggerName.equals("root") ? "" : loggerName;
185 final boolean additive = Booleans.parseBoolean(additivity, true);
186
187 return new AsyncLoggerConfig(name, appenderRefs, filter, level,
188 additive, properties, config, includeLocation(includeLocation));
189 }
190
191
192 protected static boolean includeLocation(final String includeLocationConfigValue) {
193 return Boolean.parseBoolean(includeLocationConfigValue);
194 }
195
196
197
198
199 @Plugin(name = "asyncRoot", category = "Core", printObject = true)
200 public static class RootLogger extends LoggerConfig {
201
202 @PluginFactory
203 public static LoggerConfig createLogger(
204 @PluginAttribute("additivity") final String additivity,
205 @PluginAttribute("level") final String levelName,
206 @PluginAttribute("includeLocation") final String includeLocation,
207 @PluginElement("AppenderRef") final AppenderRef[] refs,
208 @PluginElement("Properties") final Property[] properties,
209 @PluginConfiguration final Configuration config,
210 @PluginElement("Filters") final Filter filter) {
211 final List<AppenderRef> appenderRefs = Arrays.asList(refs);
212 Level level;
213 try {
214 level = Level.toLevel(levelName, Level.ERROR);
215 } catch (final Exception ex) {
216 LOGGER.error(
217 "Invalid Log level specified: {}. Defaulting to Error",
218 levelName);
219 level = Level.ERROR;
220 }
221 final boolean additive = Booleans.parseBoolean(additivity, true);
222
223 return new AsyncLoggerConfig(LogManager.ROOT_LOGGER_NAME,
224 appenderRefs, filter, level, additive, properties, config,
225 includeLocation(includeLocation));
226 }
227 }
228 }