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 final Log4jMarkerFactory markerFactory;
35 private static final String TO_SLF4J_CONTEXT = "org.apache.logging.slf4j.SLF4JLoggerContext";
36
37 public Log4jLoggerFactory(final Log4jMarkerFactory markerFactory) {
38 this.markerFactory = markerFactory;
39 }
40
41
42 @Override
43 protected Logger newLogger(final String name, final LoggerContext context) {
44 final String key = Logger.ROOT_LOGGER_NAME.equals(name) ? LogManager.ROOT_LOGGER_NAME : name;
45 return new Log4jLogger(markerFactory, validateContext(context).getLogger(key), name);
46 }
47
48 @Override
49 protected LoggerContext getContext() {
50 final Class<?> anchor = StackLocatorUtil.getCallerClass(FQCN, PACKAGE);
51 return anchor == null ? LogManager.getContext() : getContext(StackLocatorUtil.getCallerClass(anchor));
52 }
53
54 Log4jMarkerFactory getMarkerFactory() {
55 return markerFactory;
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 }