log4j2 Logger работает только в основном классе — Spring Boot

#java #spring-boot #log4j #log4j2

#java #весенняя загрузка #log4j #log4j2

Вопрос:

Я пытаюсь использовать функциональность rolling logges log4j2 для нового приложения, но я не могу заставить регистратор работать вне основного класса, пробуя различные комбинации статических, конечных и автоматически подключаемых конфигураций во вторичных классах.

Все классы и конфигурация ниже. Что я пропускаю или неправильно вызываю?

POM.XML

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
...

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

Корневой класс:

 @SpringBootApplication
public class DocumentServiceApplication {

    private static final Logger logger = LogManager.getLogger(DocumentServiceApplication.class);

    public static void main(String[] args) {

            //these work.
        logger.debug("Logger correctly configured debug.");
        logger.error("Logger correctly configured error.");
        logger.info("Logger correctly configured info.");

        SpringApplication.run(DocumentServiceApplication.class, args);
    }

}
  

Вторичный (веб-API) класс:

 @RestController
public class DocumentController {

    @Autowired
    private PPAFileService ppaFileService;

    private static final Logger logger = LogManager.getLogger(DocumentController.class);

    @GetMapping("/ppa/process")
    @ResponseBody
    public ResponseEntity<String> process( ) throws Exception
    {
        try {
            //this logging gives no error and no entry on console or file.
            logger.debug("Received request for PPA file.");
            ...

        } catch (Exception e) {
            return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
        }
    }
}
  

Вывод журнала

 2019-04-10 15:37:56 DEBUG Logger correctly configured debug.
2019-04-10 15:37:56 ERROR Logger correctly configured error.
2019-04-10 15:37:56 INFO  Logger correctly configured info.
  

log4j2.properties

 status = error
name = PropertiesConfig

#Make sure to change log file path as per your need

property.filename = D:\projects\app\application.log

filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appenders = rolling

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = application-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20

loggers = rolling

logger.rolling.name = com.app.documentservice
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
  

Комментарии:

1. К вашему сведению, использование статических регистраторов, подобных этому, считается неуклюжей / плохой практикой. Вместо этого вы должны get() использовать регистратор только тогда, когда он вам нужен, и отпустите ссылку, как только закончите с ней. К сожалению, я не знаю, что может быть причиной проблемы с Spring Boot.

2. Ну, поскольку регистратор потокобезопасен, это кажется довольно банальным стандартом плохой практики, не говоря уже о бессмысленном раздувании кода для получения дескриптора в каждой функции. Тем не менее, спасибо за предупреждение.

3. Это не безопасность потоков, это начальная стоимость, которая добавляется к каждому классу, плюс эти ссылки никогда не могут быть собраны мусором. Серьезно, этот стиль был в моде 15 лет назад, но с тех пор я не видел, чтобы его пропагандировали.

4. Просто сравнительный анализ по сравнению заводская версия и 99-й процентиль разницы менее 30 мс после 200 запусков. Послушайте, как мастер CS, я понимаю, что производительность имеет большое значение, но на тот момент я бы даже не стал использовать Spring Boot. Это не имеет значения для проблемы. И это не решило проблему.