1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.config;
19
20 import java.util.Objects;
21 import java.util.concurrent.locks.ReadWriteLock;
22 import java.util.concurrent.locks.ReentrantReadWriteLock;
23
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.Marker;
26 import org.apache.logging.log4j.core.LogEvent;
27 import org.apache.logging.log4j.message.Message;
28 import org.apache.logging.log4j.util.Supplier;
29
30
31
32
33 public class LockingReliabilityStrategy implements ReliabilityStrategy {
34 private final LoggerConfig loggerConfig;
35 private final ReadWriteLock reconfigureLock = new ReentrantReadWriteLock();
36 private volatile boolean isStopping = false;
37
38 public LockingReliabilityStrategy(final LoggerConfig loggerConfig) {
39 this.loggerConfig = Objects.requireNonNull(loggerConfig, "loggerConfig was null");
40 }
41
42
43
44
45
46
47
48
49 @Override
50 public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn,
51 final Marker marker, final Level level, final Message data, final Throwable t) {
52
53 final LoggerConfig config = getActiveLoggerConfig(reconfigured);
54 try {
55 config.log(loggerName, fqcn, marker, level, data, t);
56 } finally {
57 config.getReliabilityStrategy().afterLogEvent();
58 }
59 }
60
61
62
63
64
65
66
67 @Override
68 public void log(final Supplier<LoggerConfig> reconfigured, final LogEvent event) {
69 final LoggerConfig config = getActiveLoggerConfig(reconfigured);
70 try {
71 config.log(event);
72 } finally {
73 config.getReliabilityStrategy().afterLogEvent();
74 }
75 }
76
77
78
79
80
81
82
83
84 @Override
85 public LoggerConfig getActiveLoggerConfig(final Supplier<LoggerConfig> next) {
86 LoggerConfig result = this.loggerConfig;
87 if (!beforeLogEvent()) {
88 result = next.get();
89 return result.getReliabilityStrategy().getActiveLoggerConfig(next);
90 }
91 return result;
92 }
93
94 private boolean beforeLogEvent() {
95 reconfigureLock.readLock().lock();
96 if (isStopping) {
97 reconfigureLock.readLock().unlock();
98 return false;
99 }
100 return true;
101 }
102
103 @Override
104 public void afterLogEvent() {
105 reconfigureLock.readLock().unlock();
106 }
107
108
109
110
111
112
113 @Override
114 public void beforeStopAppenders() {
115 reconfigureLock.writeLock().lock();
116 try {
117 isStopping = true;
118 } finally {
119 reconfigureLock.writeLock().unlock();
120 }
121 }
122
123
124
125
126
127
128
129
130 @Override
131 public void beforeStopConfiguration(final Configuration configuration) {
132
133 }
134
135 }