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.jdbc;
18
19 import java.io.Serializable;
20 import java.nio.charset.Charset;
21 import java.sql.PreparedStatement;
22 import java.util.Arrays;
23 import java.util.Objects;
24
25 import org.apache.logging.log4j.core.Appender;
26 import org.apache.logging.log4j.core.Core;
27 import org.apache.logging.log4j.core.Filter;
28 import org.apache.logging.log4j.core.Layout;
29 import org.apache.logging.log4j.core.appender.AbstractAppender;
30 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
31 import org.apache.logging.log4j.core.appender.db.ColumnMapping;
32 import org.apache.logging.log4j.core.config.plugins.Plugin;
33 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
34 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
35 import org.apache.logging.log4j.core.config.plugins.PluginElement;
36 import org.apache.logging.log4j.core.config.plugins.convert.TypeConverter;
37 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
38 import org.apache.logging.log4j.core.util.Assert;
39 import org.apache.logging.log4j.core.util.Booleans;
40
41
42
43
44
45
46
47
48
49
50
51
52
53 @Plugin(name = "JDBC", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
54 public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseManager> {
55
56 private final String description;
57
58 private JdbcAppender(final String name, final Filter filter, final boolean ignoreExceptions,
59 final JdbcDatabaseManager manager) {
60 super(name, filter, ignoreExceptions, manager);
61 this.description = this.getName() + "{ manager=" + this.getManager() + " }";
62 }
63
64 @Override
65 public String toString() {
66 return this.description;
67 }
68
69
70
71
72
73
74
75 @Deprecated
76 public static <B extends Builder<B>> JdbcAppender createAppender(final String name, final String ignore,
77 final Filter filter,
78 final ConnectionSource connectionSource,
79 final String bufferSize, final String tableName,
80 final ColumnConfig[] columnConfigs) {
81 Assert.requireNonEmpty(name, "Name cannot be empty");
82 Objects.requireNonNull(connectionSource, "ConnectionSource cannot be null");
83 Assert.requireNonEmpty(tableName, "Table name cannot be empty");
84 Assert.requireNonEmpty(columnConfigs, "ColumnConfigs cannot be empty");
85
86 final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0);
87 final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
88
89 return JdbcAppender.<B>newBuilder()
90 .setBufferSize(bufferSizeInt)
91 .setColumnConfigs(columnConfigs)
92 .setConnectionSource(connectionSource)
93 .setTableName(tableName)
94 .withName(name)
95 .withIgnoreExceptions(ignoreExceptions)
96 .withFilter(filter)
97 .build();
98 }
99
100 @PluginBuilderFactory
101 public static <B extends Builder<B>> B newBuilder() {
102 return new Builder<B>().asBuilder();
103 }
104
105 public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
106 implements org.apache.logging.log4j.core.util.Builder<JdbcAppender> {
107
108 @PluginElement("ConnectionSource")
109 @Required(message = "No ConnectionSource provided")
110 private ConnectionSource connectionSource;
111
112 @PluginBuilderAttribute
113 private int bufferSize;
114
115 @PluginBuilderAttribute
116 @Required(message = "No table name provided")
117 private String tableName;
118
119 @PluginElement("ColumnConfigs")
120 private ColumnConfig[] columnConfigs;
121
122 @PluginElement("ColumnMappings")
123 private ColumnMapping[] columnMappings;
124
125
126
127
128 public B setConnectionSource(final ConnectionSource connectionSource) {
129 this.connectionSource = connectionSource;
130 return asBuilder();
131 }
132
133
134
135
136
137 public B setBufferSize(final int bufferSize) {
138 this.bufferSize = bufferSize;
139 return asBuilder();
140 }
141
142
143
144
145 public B setTableName(final String tableName) {
146 this.tableName = tableName;
147 return asBuilder();
148 }
149
150
151
152
153 public B setColumnConfigs(final ColumnConfig... columnConfigs) {
154 this.columnConfigs = columnConfigs;
155 return asBuilder();
156 }
157
158 public B setColumnMappings(final ColumnMapping... columnMappings) {
159 this.columnMappings = columnMappings;
160 return asBuilder();
161 }
162
163 @Override
164 public JdbcAppender build() {
165 if (Assert.isEmpty(columnConfigs) && Assert.isEmpty(columnMappings)) {
166 LOGGER.error("Cannot create JdbcAppender without any columns configured.");
167 return null;
168 }
169 final String managerName = "JdbcManager{name=" + getName() + ", bufferSize=" + bufferSize + ", tableName=" +
170 tableName + ", columnConfigs=" + Arrays.toString(columnConfigs) + ", columnMappings=" +
171 Arrays.toString(columnMappings) + '}';
172 final JdbcDatabaseManager manager = JdbcDatabaseManager.getManager(managerName, bufferSize,
173 connectionSource, tableName, columnConfigs, columnMappings);
174 if (manager == null) {
175 return null;
176 }
177 return new JdbcAppender(getName(), getFilter(), isIgnoreExceptions(), manager);
178 }
179
180 @Override
181 @Deprecated
182 public Layout<? extends Serializable> getLayout() {
183 throw new UnsupportedOperationException();
184 }
185
186 @Override
187 @Deprecated
188 public B withLayout(final Layout<? extends Serializable> layout) {
189 throw new UnsupportedOperationException();
190 }
191
192 @Override
193 @Deprecated
194 public Layout<? extends Serializable> getOrCreateLayout() {
195 throw new UnsupportedOperationException();
196 }
197
198 @Override
199 @Deprecated
200 public Layout<? extends Serializable> getOrCreateLayout(final Charset charset) {
201 throw new UnsupportedOperationException();
202 }
203 }
204 }