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