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