1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender.db;
18
19 import java.io.Serializable;
20 import java.util.concurrent.TimeUnit;
21 import java.util.concurrent.locks.Lock;
22 import java.util.concurrent.locks.ReadWriteLock;
23 import java.util.concurrent.locks.ReentrantReadWriteLock;
24
25 import org.apache.logging.log4j.LoggingException;
26 import org.apache.logging.log4j.core.Filter;
27 import org.apache.logging.log4j.core.Layout;
28 import org.apache.logging.log4j.core.LogEvent;
29 import org.apache.logging.log4j.core.appender.AbstractAppender;
30 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
31
32
33
34
35
36
37
38
39
40 public abstract class AbstractDatabaseAppender<T extends AbstractDatabaseManager> extends AbstractAppender {
41
42 private final ReadWriteLock lock = new ReentrantReadWriteLock();
43 private final Lock readLock = lock.readLock();
44 private final Lock writeLock = lock.writeLock();
45
46 private T manager;
47
48
49
50
51
52
53
54
55
56
57 protected AbstractDatabaseAppender(final String name, final Filter filter, final boolean ignoreExceptions,
58 final T manager) {
59 super(name, filter, null, ignoreExceptions);
60 this.manager = manager;
61 }
62
63
64
65
66
67
68
69
70
71
72
73 protected AbstractDatabaseAppender(final String name, final Filter filter,
74 final Layout<? extends Serializable> layout, final boolean ignoreExceptions, final T manager) {
75 super(name, filter, layout, ignoreExceptions);
76 this.manager = manager;
77 }
78
79
80
81
82
83
84
85 @Override
86 public final Layout<LogEvent> getLayout() {
87 return null;
88 }
89
90
91
92
93
94
95 public final T getManager() {
96 return this.manager;
97 }
98
99 @Override
100 public final void start() {
101 if (this.getManager() == null) {
102 LOGGER.error("No AbstractDatabaseManager set for the appender named [{}].", this.getName());
103 }
104 super.start();
105 if (this.getManager() != null) {
106 this.getManager().startup();
107 }
108 }
109
110 @Override
111 public boolean stop(final long timeout, final TimeUnit timeUnit) {
112 setStopping();
113 boolean stopped = super.stop(timeout, timeUnit, false);
114 if (this.getManager() != null) {
115 stopped &= this.getManager().stop(timeout, timeUnit);
116 }
117 setStopped();
118 return stopped;
119 }
120
121 @Override
122 public final void append(final LogEvent event) {
123 this.readLock.lock();
124 try {
125 this.getManager().write(event, toSerializable(event));
126 } catch (final LoggingException e) {
127 LOGGER.error("Unable to write to database [{}] for appender [{}].", this.getManager().getName(),
128 this.getName(), e);
129 throw e;
130 } catch (final Exception e) {
131 LOGGER.error("Unable to write to database [{}] for appender [{}].", this.getManager().getName(),
132 this.getName(), e);
133 throw new AppenderLoggingException("Unable to write to database in appender: " + e.getMessage(), e);
134 } finally {
135 this.readLock.unlock();
136 }
137 }
138
139
140
141
142
143
144
145
146 protected final void replaceManager(final T manager) {
147 this.writeLock.lock();
148 try {
149 final T old = this.getManager();
150 if (!manager.isRunning()) {
151 manager.startup();
152 }
153 this.manager = manager;
154 old.close();
155 } finally {
156 this.writeLock.unlock();
157 }
158 }
159 }