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 org.apache.logging.log4j.Level;
20 import org.apache.logging.log4j.Logger;
21 import org.apache.logging.log4j.status.StatusLogger;
22 import org.apache.logging.log4j.util.LoaderUtil;
23 import org.apache.logging.log4j.util.PropertiesUtil;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class AsyncQueueFullPolicyFactory {
46 static final String PROPERTY_NAME_ASYNC_EVENT_ROUTER = "log4j2.AsyncQueueFullPolicy";
47 static final String PROPERTY_VALUE_DEFAULT_ASYNC_EVENT_ROUTER = "Default";
48 static final String PROPERTY_VALUE_DISCARDING_ASYNC_EVENT_ROUTER = "Discard";
49 static final String PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL = "log4j2.DiscardThreshold";
50
51 private static final Logger LOGGER = StatusLogger.getLogger();
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public static AsyncQueueFullPolicy create() {
68 final String router = PropertiesUtil.getProperties().getStringProperty(PROPERTY_NAME_ASYNC_EVENT_ROUTER);
69 if (router == null || PROPERTY_VALUE_DEFAULT_ASYNC_EVENT_ROUTER.equals(router)
70 || DefaultAsyncQueueFullPolicy.class.getSimpleName().equals(router)
71 || DefaultAsyncQueueFullPolicy.class.getName().equals(router)) {
72 return new DefaultAsyncQueueFullPolicy();
73 }
74 if (PROPERTY_VALUE_DISCARDING_ASYNC_EVENT_ROUTER.equals(router)
75 || DiscardingAsyncQueueFullPolicy.class.getSimpleName().equals(router)
76 || DiscardingAsyncQueueFullPolicy.class.getName().equals(router)) {
77 return createDiscardingAsyncQueueFullPolicy();
78 }
79 return createCustomRouter(router);
80 }
81
82 private static AsyncQueueFullPolicy createCustomRouter(final String router) {
83 try {
84 final Class<? extends AsyncQueueFullPolicy> cls = LoaderUtil.loadClass(router).asSubclass(AsyncQueueFullPolicy.class);
85 LOGGER.debug("Creating custom AsyncQueueFullPolicy '{}'", router);
86 return cls.newInstance();
87 } catch (final Exception ex) {
88 LOGGER.debug("Using DefaultAsyncQueueFullPolicy. Could not create custom AsyncQueueFullPolicy '{}': {}", router,
89 ex.toString());
90 return new DefaultAsyncQueueFullPolicy();
91 }
92 }
93
94 private static AsyncQueueFullPolicy createDiscardingAsyncQueueFullPolicy() {
95 final PropertiesUtil util = PropertiesUtil.getProperties();
96 final String level = util.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, Level.INFO.name());
97 final Level thresholdLevel = Level.toLevel(level, Level.INFO);
98 LOGGER.debug("Creating custom DiscardingAsyncQueueFullPolicy(discardThreshold:{})", thresholdLevel);
99 return new DiscardingAsyncQueueFullPolicy(thresholdLevel);
100 }
101 }