1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.slf4j;
18
19 import org.apache.logging.log4j.LogManager;
20 import org.apache.logging.log4j.LoggingException;
21 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
22 import org.apache.logging.log4j.spi.LoggerContext;
23 import org.apache.logging.log4j.status.StatusLogger;
24 import org.apache.logging.log4j.util.StackLocatorUtil;
25 import org.slf4j.ILoggerFactory;
26 import org.slf4j.Logger;
27
28 import java.util.function.Predicate;
29
30
31
32
33 public class Log4jLoggerFactory extends AbstractLoggerAdapter<Logger> implements ILoggerFactory {
34
35 private static final StatusLogger LOGGER = StatusLogger.getLogger();
36 private static final String SLF4J_PACKAGE = "org.slf4j";
37 private static final String TO_SLF4J_CONTEXT = "org.apache.logging.slf4j.SLF4JLoggerContext";
38 private static final Predicate<Class<?>> CALLER_PREDICATE = clazz ->
39 !AbstractLoggerAdapter.class.equals(clazz) && !clazz.getName().startsWith(SLF4J_PACKAGE);
40
41 @Override
42 protected Logger newLogger(final String name, final LoggerContext context) {
43 final String key = Logger.ROOT_LOGGER_NAME.equals(name) ? LogManager.ROOT_LOGGER_NAME : name;
44 return new Log4jLogger(validateContext(context).getLogger(key), name);
45 }
46
47 @Override
48 protected LoggerContext getContext() {
49 final Class<?> anchor = LogManager.getFactory().isClassLoaderDependent()
50 ? StackLocatorUtil.getCallerClass(Log4jLoggerFactory.class, CALLER_PREDICATE)
51 : null;
52 LOGGER.trace("Log4jLoggerFactory.getContext() found anchor {}", anchor);
53 return anchor == null
54 ? LogManager.getContext(false)
55 : getContext(anchor);
56 }
57
58 private LoggerContext validateContext(final LoggerContext context) {
59 if (TO_SLF4J_CONTEXT.equals(context.getClass().getName())) {
60 throw new LoggingException("log4j-slf4j-impl cannot be present with log4j-to-slf4j");
61 }
62 return context;
63 }
64 }