SpringBoot и log4j2 - контекст приложения загружается дважды, когда SpringApplication.run () - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу использовать Spring boot и log4j2.

У меня есть этот pom:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

Это мой основной класс:

@Component("batchLauncher")
@Import({ MyConfiguration.class })
public class MyLauncher implements CommandLineRunner {

    private static Logger log = LogManager.getLogger(MyLauncher.class);

    @Autowired
    MyController myController;

    public static void main(String[] args) {
        log.info("STARTING");
        SpringApplication.run(MyLauncher.class, args);
        log.info("FINISHED");
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("START Batch");
        MyController.start();
        log.info("END Batch");      
    }
}

Я запускаюjar с этой опцией:

-Dlog4j.configurationFile=C:\log4j2.properties

При запуске приложения консоль показывает мне:

    DEBUG StatusLogger Reconfiguration complete for context[name=18b4aac2] at URI C:\log4j2.properties (org.apache.logging.log4j.core.LoggerContext@72057ecf) with optional ClassLoader: null
DEBUG StatusLogger Shutdown hook enabled. Registering a new one.
DEBUG StatusLogger LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@72057ecf] started OK.
2019-02-08 14:57:31.047 INFO [main] [it.batch.MyLauncher] [main] [it.batch.MyLauncher.main] - STARTING THE APPLICATION


DEBUG StatusLogger Using configurationFactory org.apache.logging.log4j.core.config.ConfigurationFactory$Factory@6c80d78a
DEBUG StatusLogger Not in a ServletContext environment, thus not loading WebLookup plugin.
DEBUG StatusLogger Loaded configuration from 
...
DEBUG StatusLogger LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@72057ecf] started OK with configuration XmlConfiguration[location=jar:file:/C:/Users/G0426/.m2/repository/org/springframework/boot/spring-boot/2.1.2.RELEASE/spring-boot-2.1.2.RELEASE.jar!/org/springframework/boot/logging/log4j2/log4j2.xml].


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-02-08 14:57:31.753  INFO 13496 --- [           main] i.f.c.c.o.b.Info

Как видно из журналов, log4j2 загружает мой log4jфайл свойств до строки

SpringApplication.run(MyLauncher.class, args);

Предыдущая строка записывается в файл журнала, после чего запускается SpringApplication.run (...), загружается второй экземпляр / контекст и log4j2 начинает запись с использованием конфигурации по умолчаниюнаходится по адресу:

file:/C:/Users/G0426/.m2/repository/org/springframework/boot/spring-boot/2.1.2.RELEASE/spring-boot-2.1.2.RELEASE.jar!/org/springframework/boot/logging/log4j2/log4j2.xml

Что я делаю не так?

Спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

SpringApplication.run(MyLauncher.class, args); является отправной точкой приложения Spring.Spring не контролирует что-либо записанное перед его выполнением.

Следовательно, поведение является подходящим, учитывая, что конфигурация регистрации на основе Spring запускается только после загрузки ее контекста.Кроме того, Spring Boot использует свойство logging.config для загрузки конфигурации ведения журнала.

Вы можете попробовать установить -Dlogging.config=C:\log4j.properties.

Подробнее см. Spring Boot Documentation .

...