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