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 @Override
46 public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn,
47 final Marker marker, final Level level, final Message data, final Throwable t) {
48
49 final LoggerConfig config = getActiveLoggerConfig(reconfigured);
50 try {
51 config.log(loggerName, fqcn, marker, level, data, t);
52 } finally {
53 config.getReliabilityStrategy().afterLogEvent();
54 }
55 }
56
57
58
59
60 @Override
61 public void log(final Supplier<LoggerConfig> reconfigured, final LogEvent event) {
62 final LoggerConfig config = getActiveLoggerConfig(reconfigured);
63 try {
64 config.log(event);
65 } finally {
66 config.getReliabilityStrategy().afterLogEvent();
67 }
68 }
69
70
71
72
73 @Override
74 public LoggerConfig getActiveLoggerConfig(final Supplier<LoggerConfig> next) {
75 LoggerConfig result = this.loggerConfig;
76 if (!beforeLogEvent()) {
77 result = next.get();
78 return result.getReliabilityStrategy().getActiveLoggerConfig(next);
79 }
80 return result;
81 }
82
83 private boolean beforeLogEvent() {
84 reconfigureLock.readLock().lock();
85 if (isStopping) {
86 reconfigureLock.readLock().unlock();
87 return false;
88 }
89 return true;
90 }
91
92 public void afterLogEvent() {
93 reconfigureLock.readLock().unlock();
94 }
95
96
97
98
99 @Override
100 public void beforeStopAppenders() {
101 reconfigureLock.writeLock().lock();
102 try {
103 isStopping = true;
104 } finally {
105 reconfigureLock.writeLock().unlock();
106 }
107 }
108
109
110
111
112 @Override
113 public void beforeStopConfiguration(Configuration configuration) {
114
115 }
116
117 }