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 java.io.Serializable;
20 import java.util.concurrent.locks.Lock;
21 import java.util.concurrent.locks.ReadWriteLock;
22 import java.util.concurrent.locks.ReentrantReadWriteLock;
23
24 import org.apache.logging.log4j.core.Filter;
25 import org.apache.logging.log4j.core.Layout;
26 import org.apache.logging.log4j.core.LogEvent;
27
28
29
30
31
32
33 public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
34
35 private static final long serialVersionUID = 1L;
36
37
38
39
40
41
42
43 private final boolean immediateFlush;
44
45 private final M manager;
46
47 private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
48 private final Lock readLock = rwLock.readLock();
49
50
51
52
53
54
55
56
57
58 protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout,
59 final Filter filter, final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
60 super(name, filter, layout, ignoreExceptions);
61 this.manager = manager;
62 this.immediateFlush = immediateFlush;
63 }
64
65
66
67
68
69
70 public boolean getImmediateFlush() {
71 return immediateFlush;
72 }
73
74
75
76
77
78
79 public M getManager() {
80 return manager;
81 }
82
83 @Override
84 public void start() {
85 if (getLayout() == null) {
86 LOGGER.error("No layout set for the appender named [" + getName() + "].");
87 }
88 if (manager == null) {
89 LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
90 }
91 super.start();
92 }
93
94 @Override
95 public void stop() {
96 super.stop();
97 manager.release();
98 }
99
100
101
102
103
104
105
106
107
108 @Override
109 public void append(final LogEvent event) {
110 readLock.lock();
111 try {
112 final byte[] bytes = getLayout().toByteArray(event);
113 if (bytes.length > 0) {
114 manager.write(bytes);
115 if (this.immediateFlush || event.isEndOfBatch()) {
116 manager.flush();
117 }
118 }
119 } catch (final AppenderLoggingException ex) {
120 error("Unable to write to stream " + manager.getName() + " for appender " + getName());
121 throw ex;
122 } finally {
123 readLock.unlock();
124 }
125 }
126
127 }