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.sql.Connection;
20 import java.sql.SQLException;
21 import java.util.Objects;
22
23 import javax.naming.NamingException;
24 import javax.sql.DataSource;
25
26 import org.apache.logging.log4j.Logger;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
29 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
30 import org.apache.logging.log4j.core.net.JndiManager;
31 import org.apache.logging.log4j.status.StatusLogger;
32 import org.apache.logging.log4j.util.Strings;
33
34
35
36
37 @Plugin(name = "DataSource", category = "Core", elementType = "connectionSource", printObject = true)
38 public final class DataSourceConnectionSource implements ConnectionSource {
39 private static final Logger LOGGER = StatusLogger.getLogger();
40
41 private final DataSource dataSource;
42 private final String description;
43
44 private DataSourceConnectionSource(final String dataSourceName, final DataSource dataSource) {
45 this.dataSource = Objects.requireNonNull(dataSource, "dataSource");
46 this.description = "dataSource{ name=" + dataSourceName + ", value=" + dataSource + " }";
47 }
48
49 @Override
50 public Connection getConnection() throws SQLException {
51 return this.dataSource.getConnection();
52 }
53
54 @Override
55 public String toString() {
56 return this.description;
57 }
58
59
60
61
62
63
64
65 @PluginFactory
66 public static DataSourceConnectionSource createConnectionSource(@PluginAttribute("jndiName") final String jndiName) {
67 if (!JndiManager.isJndiJdbcEnabled()) {
68 LOGGER.error("JNDI must be enabled by setting log4j2.enableJndiJdbc=true");
69 return null;
70 }
71 if (Strings.isEmpty(jndiName)) {
72 LOGGER.error("No JNDI name provided.");
73 return null;
74 }
75 try {
76 @SuppressWarnings("resource")
77 final DataSource dataSource = JndiManager.getDefaultManager(DataSourceConnectionSource.class.getCanonicalName()).lookup(jndiName);
78 if (dataSource == null) {
79 LOGGER.error("No DataSource found with JNDI name [" + jndiName + "].");
80 return null;
81 }
82 return new DataSourceConnectionSource(jndiName, dataSource);
83 } catch (final NamingException e) {
84 LOGGER.error(e.getMessage(), e);
85 return null;
86 }
87 }
88 }