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
44
45
46 protected final boolean immediateFlush;
47
48 private final M manager;
49
50 private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
51 private final Lock readLock = rwLock.readLock();
52
53
54
55
56
57
58
59
60
61 protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
62 final boolean ignoreExceptions, final boolean immediateFlush,
63 final M manager) {
64 super(name, filter, layout, ignoreExceptions);
65 this.manager = manager;
66 this.immediateFlush = immediateFlush;
67 }
68
69
70
71
72
73
74 public M getManager() {
75 return manager;
76 }
77
78 @Override
79 public void start() {
80 if (getLayout() == null) {
81 LOGGER.error("No layout set for the appender named [" + getName() + "].");
82 }
83 if (manager == null) {
84 LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
85 }
86 super.start();
87 }
88
89 @Override
90 public void stop() {
91 super.stop();
92 manager.release();
93 }
94
95
96
97
98
99
100
101
102
103
104 @Override
105 public void append(final LogEvent event) {
106 readLock.lock();
107 try {
108 final byte[] bytes = getLayout().toByteArray(event);
109 if (bytes.length > 0) {
110 manager.write(bytes);
111 if (this.immediateFlush || event.isEndOfBatch()) {
112 manager.flush();
113 }
114 }
115 } catch (final AppenderLoggingException ex) {
116 error("Unable to write to stream " + manager.getName() + " for appender " + getName());
117 throw ex;
118 } finally {
119 readLock.unlock();
120 }
121 }
122 }