mirror of https://github.com/halo-dev/halo
Turn off logging of TemplateEngine (#7284)
#### What type of PR is this? /kind bug /area core /milestone 2.20.x #### What this PR does / why we need it: This PR turns off the logging of TemplateEngine to prevent too many annoying and useless logs. Please note that the TemplateExceptions won't be eat up because we have a global error handler to log them. #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/4468 #### Special notes for your reviewer: Steps to verify: - Start Halo instance - Execute command `ab -c 100 -n 10000 -H 'Accept: text/html' -H 'Cache-Control: no-cache' http://localhost:8090/` and then press `Ctrl + C` to stop the ab process. - See the logs of Halo instance. #### Does this PR introduce a user-facing change? ```release-note 解决日志中出现大量 InterruptedException 异常的问题 ```pull/7277/merge
parent
4ad97cd58e
commit
fed80f26f2
|
@ -1,7 +1,9 @@
|
||||||
package run.halo.app.theme.engine;
|
package run.halo.app.theme.engine;
|
||||||
|
|
||||||
|
import java.nio.channels.ClosedByInterruptException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.reactivestreams.Publisher;
|
import org.reactivestreams.Publisher;
|
||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||||
|
@ -9,6 +11,7 @@ import org.springframework.http.MediaType;
|
||||||
import org.thymeleaf.context.IContext;
|
import org.thymeleaf.context.IContext;
|
||||||
import org.thymeleaf.messageresolver.IMessageResolver;
|
import org.thymeleaf.messageresolver.IMessageResolver;
|
||||||
import org.thymeleaf.spring6.SpringWebFluxTemplateEngine;
|
import org.thymeleaf.spring6.SpringWebFluxTemplateEngine;
|
||||||
|
import reactor.core.Exceptions;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
import reactor.core.scheduler.Schedulers;
|
import reactor.core.scheduler.Schedulers;
|
||||||
|
@ -18,6 +21,7 @@ import reactor.core.scheduler.Schedulers;
|
||||||
*
|
*
|
||||||
* @author johnniang
|
* @author johnniang
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class HaloTemplateEngine extends SpringWebFluxTemplateEngine {
|
public class HaloTemplateEngine extends SpringWebFluxTemplateEngine {
|
||||||
|
|
||||||
private final IMessageResolver messageResolver;
|
private final IMessageResolver messageResolver;
|
||||||
|
@ -43,20 +47,22 @@ public class HaloTemplateEngine extends SpringWebFluxTemplateEngine {
|
||||||
// while processing.
|
// while processing.
|
||||||
if (publisher instanceof Mono<DataBuffer> mono) {
|
if (publisher instanceof Mono<DataBuffer> mono) {
|
||||||
return mono.subscribeOn(Schedulers.boundedElastic())
|
return mono.subscribeOn(Schedulers.boundedElastic())
|
||||||
// We should switch back to non-blocking thread.
|
.doOnError(Exception.class, e -> this.logTemplateError(e, template));
|
||||||
// See https://github.com/spring-projects/spring-framework/issues/26958
|
|
||||||
// for more details.
|
|
||||||
.publishOn(Schedulers.parallel());
|
|
||||||
}
|
}
|
||||||
if (publisher instanceof Flux<DataBuffer> flux) {
|
if (publisher instanceof Flux<DataBuffer> flux) {
|
||||||
return flux
|
return flux.subscribeOn(Schedulers.boundedElastic())
|
||||||
.subscribeOn(Schedulers.boundedElastic())
|
.doOnError(Exception.class, e -> this.logTemplateError(e, template));
|
||||||
// We should switch back to non-blocking thread.
|
|
||||||
// See https://github.com/spring-projects/spring-framework/issues/26958
|
|
||||||
// for more details.
|
|
||||||
.publishOn(Schedulers.parallel());
|
|
||||||
}
|
}
|
||||||
return publisher;
|
return publisher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void logTemplateError(Exception e, String template) {
|
||||||
|
if (Exceptions.unwrap(e.getCause()) instanceof InterruptedException) {
|
||||||
|
log.warn("Interrupted while processing template: {}", template);
|
||||||
|
}
|
||||||
|
if (e.getCause() instanceof ClosedByInterruptException) {
|
||||||
|
log.warn("Interrupted while outputting template: {}", template);
|
||||||
|
}
|
||||||
|
// other exceptions will be caught by error handler
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ halo:
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
run.halo.app: DEBUG
|
run.halo.app: DEBUG
|
||||||
|
web: DEBUG
|
||||||
org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler: DEBUG
|
org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler: DEBUG
|
||||||
springdoc:
|
springdoc:
|
||||||
cache:
|
cache:
|
||||||
|
|
|
@ -57,6 +57,8 @@ springdoc:
|
||||||
writer-with-order-by-keys: true
|
writer-with-order-by-keys: true
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
|
level:
|
||||||
|
org.thymeleaf.TemplateEngine: OFF
|
||||||
file:
|
file:
|
||||||
name: ${halo.work-dir}/logs/halo.log
|
name: ${halo.work-dir}/logs/halo.log
|
||||||
logback:
|
logback:
|
||||||
|
|
Loading…
Reference in New Issue