1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.lookup;
18
19 import java.util.Objects;
20
21 import javax.naming.NamingException;
22
23 import org.apache.logging.log4j.Logger;
24 import org.apache.logging.log4j.Marker;
25 import org.apache.logging.log4j.MarkerManager;
26 import org.apache.logging.log4j.core.LogEvent;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.net.JndiManager;
29 import org.apache.logging.log4j.status.StatusLogger;
30
31
32
33
34 @Plugin(name = "jndi", category = StrLookup.CATEGORY)
35 public class JndiLookup extends AbstractLookup {
36
37 private static final Logger LOGGER = StatusLogger.getLogger();
38 private static final Marker LOOKUP = MarkerManager.getMarker("LOOKUP");
39
40
41 static final String CONTAINER_JNDI_RESOURCE_PATH_PREFIX = "java:comp/env/";
42
43
44
45
46 public JndiLookup() {
47 if (!JndiManager.isJndiLookupEnabled()) {
48 throw new IllegalStateException("JNDI must be enabled by setting log4j2.enableJndiLookup=true");
49 }
50 }
51
52
53
54
55
56
57
58
59 @Override
60 public String lookup(final LogEvent event, final String key) {
61 if (key == null) {
62 return null;
63 }
64 final String jndiName = convertJndiName(key);
65 try (final JndiManager jndiManager = JndiManager.getDefaultManager()) {
66 return Objects.toString(jndiManager.lookup(jndiName), null);
67 } catch (final NamingException e) {
68 LOGGER.warn(LOOKUP, "Error looking up JNDI resource [{}].", jndiName, e);
69 return null;
70 }
71 }
72
73
74
75
76
77
78
79
80 private String convertJndiName(final String jndiName) {
81 if (!jndiName.startsWith(CONTAINER_JNDI_RESOURCE_PATH_PREFIX) && jndiName.indexOf(':') == -1) {
82 return CONTAINER_JNDI_RESOURCE_PATH_PREFIX + jndiName;
83 }
84 return jndiName;
85 }
86 }