1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import org.apache.logging.log4j.core.Filter;
20 import org.apache.logging.log4j.core.Layout;
21 import org.apache.logging.log4j.core.LogEvent;
22
23 import java.util.concurrent.locks.Lock;
24 import java.util.concurrent.locks.ReadWriteLock;
25 import java.util.concurrent.locks.ReentrantReadWriteLock;
26
27
28
29
30 public abstract class AbstractOutputStreamAppender extends AbstractAppender {
31
32
33
34
35
36
37
38
39
40
41 protected final boolean immediateFlush;
42
43 private volatile OutputStreamManager manager;
44
45 private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
46 private final Lock readLock = rwLock.readLock();
47 private final Lock writeLock = rwLock.writeLock();
48
49
50
51
52
53
54
55
56
57 protected AbstractOutputStreamAppender(String name, Layout layout, Filter filter, boolean handleException,
58 boolean immediateFlush, OutputStreamManager manager) {
59 super(name, filter, layout, handleException);
60 if (layout != null) {
61 manager.setHeader(layout.getHeader());
62 manager.setFooter(layout.getFooter());
63 }
64 this.manager = manager;
65 this.immediateFlush = immediateFlush;
66 }
67
68 protected OutputStreamManager getManager() {
69 return manager;
70 }
71
72 protected void replaceManager(OutputStreamManager newManager) {
73
74 writeLock.lock();
75 try {
76 OutputStreamManager old = manager;
77 manager = newManager;
78 old.release();
79 } finally {
80 writeLock.unlock();
81 }
82
83 }
84
85 @Override
86 public void start() {
87 if (getLayout() == null) {
88 LOGGER.error("No layout set for the appender named [" + getName() + "].");
89 }
90 if (manager == null) {
91 LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
92 }
93 super.start();
94 }
95
96 @Override
97 public void stop() {
98 super.stop();
99 manager.release();
100 }
101
102
103
104
105
106
107
108
109 public void append(LogEvent event) {
110 readLock.lock();
111 try {
112 manager.write(getLayout().toByteArray(event));
113 if (this.immediateFlush) {
114 manager.flush();
115 }
116 } catch (AppenderRuntimeException ex) {
117 error("Unable to write to stream " + manager.getName() + " for appender " + getName());
118 throw ex;
119 } finally {
120 readLock.unlock();
121 }
122 }
123 }