#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. Это не имеет значения для проблемы. И это не решило проблему.