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 AbstractLoggerAdapter adapter = null;
51 final String overrideAdaptorClassName =
52 PropertiesUtil.getProperties().getStringProperty(Constants.LOGGER_ADAPTOR_PROPERTY);
53 if (overrideAdaptorClassName != null) {
54 try {
55 LOGGER.info("Trying to use LoggerAdaptor [{}] specified by Log4j property.", overrideAdaptorClassName);
56 adapter = LoaderUtil.newCheckedInstanceOf(overrideAdaptorClassName, AbstractLoggerAdapter.class);
57 } catch (final Exception e) {
58 LOGGER.error("Specified LoggerAdapter [{}] is incompatible.", overrideAdaptorClassName, e);
59 }
60 }
61 if (adapter == null) {
62
63 String adapterClassName;
64 try {
65
66 LoaderUtil.loadClass(Constants.CORE_LOGGER_CLASS_NAME);
67 adapterClassName = Constants.CORE_LOGGER_ADAPTER_CLASS_NAME;
68 } catch (final ClassNotFoundException ignored) {
69 adapterClassName = Constants.API_LOGGER_ADAPTER_CLASS_NAME;
70 }
71 LOGGER.debug("Attempting to use {}", adapterClassName);
72 try {
73 adapter = LoaderUtil.newCheckedInstanceOf(adapterClassName, AbstractLoggerAdapter.class);
74 } catch (final Exception e) {
75 throw LOGGER.throwing(new LoggingException(e));
76 }
77 }
78 loggerAdapter = adapter;
79 LOGGER.info("Registered Log4j as the java.util.logging.LogManager.");
80 }
81
82 @Override
83 public boolean addLogger(final Logger logger) {
84
85
86 return false;
87 }
88
89 @Override
90 public Logger getLogger(final String name) {
91 LOGGER.trace("Call to LogManager.getLogger({})", name);
92 Set<String> activeRequests = recursive.get();
93 if (activeRequests.add(name)) {
94 try {
95 return loggerAdapter.getLogger(name);
96 } finally {
97 activeRequests.remove(name);
98 }
99 }
100 LOGGER.warn("Recursive call to getLogger for {} ignored.", name);
101 return new NoOpLogger(name);
102 }
103
104 @Override
105 public Enumeration<String> getLoggerNames() {
106 return Collections.enumeration(loggerAdapter.getLoggersInContext(loggerAdapter.getContext()).keySet());
107 }
108
109 }