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