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.util.StackLocatorUtil;
24 import org.slf4j.ILoggerFactory;
25 import org.slf4j.Logger;
26
27
28
29
30 public class Log4jLoggerFactory extends AbstractLoggerAdapter<Logger> implements ILoggerFactory {
31
32 private static final String FQCN = Log4jLoggerFactory.class.getName();
33 private static final String PACKAGE = "org.slf4j";
34 private static final String TO_SLF4J_CONTEXT = "org.apache.logging.slf4j.SLF4JLoggerContext";
35
36 @Override
37 protected Logger newLogger(final String name, final LoggerContext context) {
38 final String key = Logger.ROOT_LOGGER_NAME.equals(name) ? LogManager.ROOT_LOGGER_NAME : name;
39 return new Log4jLogger(validateContext(context).getLogger(key), name);
40 }
41
42 @Override
43 protected LoggerContext getContext() {
44 final Class<?> anchor = StackLocatorUtil.getCallerClass(FQCN, PACKAGE);
45 return anchor == null ? LogManager.getContext() : getContext(StackLocatorUtil.getCallerClass(anchor));
46 }
47 private LoggerContext validateContext(final LoggerContext context) {
48 if (TO_SLF4J_CONTEXT.equals(context.getClass().getName())) {
49 throw new LoggingException("log4j-slf4j-impl cannot be present with log4j-to-slf4j");
50 }
51 return context;
52 }
53 }