1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.jul;
18
19 import java.util.Collections;
20 import java.util.Enumeration;
21 import java.util.HashSet;
22 import java.util.Set;
23 import java.util.logging.Logger;
24
25 import org.apache.logging.log4j.LoggingException;
26 import org.apache.logging.log4j.status.StatusLogger;
27 import org.apache.logging.log4j.util.LoaderUtil;
28 import org.apache.logging.log4j.util.PropertiesUtil;
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class LogManager extends java.util.logging.LogManager {
43
44 private static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger();
45 private final AbstractLoggerAdapter loggerAdapter;
46
47 private final ThreadLocal<Set<String>> recursive = ThreadLocal.withInitial(HashSet::new);
48
49 public LogManager() {
50 super();
51 AbstractLoggerAdapter adapter = null;
52 final String overrideAdaptorClassName =
53 PropertiesUtil.getProperties().getStringProperty(Constants.LOGGER_ADAPTOR_PROPERTY);
54 if (overrideAdaptorClassName != null) {
55 try {
56 LOGGER.info("Trying to use LoggerAdaptor [{}] specified by Log4j property.", overrideAdaptorClassName);
57 adapter = LoaderUtil.newCheckedInstanceOf(overrideAdaptorClassName, AbstractLoggerAdapter.class);
58 } catch (final Exception e) {
59 LOGGER.error("Specified LoggerAdapter [{}] is incompatible.", overrideAdaptorClassName, e);
60 }
61 }
62 if (adapter == null) {
63
64 String adapterClassName;
65 try {
66
67 LoaderUtil.loadClass(Constants.CORE_LOGGER_CLASS_NAME);
68 adapterClassName = Constants.CORE_LOGGER_ADAPTER_CLASS_NAME;
69 } catch (final ClassNotFoundException ignored) {
70 adapterClassName = Constants.API_LOGGER_ADAPTER_CLASS_NAME;
71 }
72 LOGGER.debug("Attempting to use {}", adapterClassName);
73 try {
74 adapter = LoaderUtil.newCheckedInstanceOf(adapterClassName, AbstractLoggerAdapter.class);
75 } catch (final Exception e) {
76 throw LOGGER.throwing(new LoggingException(e));
77 }
78 }
79 loggerAdapter = adapter;
80 LOGGER.info("Registered Log4j as the java.util.logging.LogManager.");
81 }
82
83 @Override
84 public boolean addLogger(final Logger logger) {
85
86
87 return false;
88 }
89
90 @Override
91 public Logger getLogger(final String name) {
92 LOGGER.trace("Call to LogManager.getLogger({})", name);
93 Set<String> activeRequests = recursive.get();
94 if (activeRequests.add(name)) {
95 try {
96 return loggerAdapter.getLogger(name);
97 } finally {
98 activeRequests.remove(name);
99 }
100 } else {
101 LOGGER.warn("Recursive call to getLogger for {} ignored.", name);
102 return new NoOpLogger(name);
103 }
104 }
105
106 @Override
107 public Enumeration<String> getLoggerNames() {
108 return Collections.enumeration(loggerAdapter.getLoggersInContext(loggerAdapter.getContext()).keySet());
109 }
110
111 }