Spring Actuator/Health Logger设为OFF,但仍记录日志。

7

我想在application.properties文件中仅将/health执行器端点的Logger设置为OFF。应用程序是基于Spring Boot 1.5构建的。

/health将成为我们F5的新监控URL,我不想让日志淹没了。

我有以下内容。

    logging.level.org.springframework.web=DEBUG

    org.springframework.boot.actuate.health.Logger=OFF
    logging.level.org.springframework.boot.actuate.health=OFF

我仍然在控制台和日志文件中收到DEBUG级别的日志。唯一有效的方法是将第一个设置为INFO或更高级别。但这不是理想的。所以,现在我正在收到这些信息。

2020-05-06 17:14:01.545 DEBUG 58588 --- [nio-9095-exec-5] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/health]
2020-05-06 17:14:01.552 DEBUG 58588 --- [nio-9095-exec-5] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/health] is: -1
2020-05-06 17:14:01.848 DEBUG 58588 --- [nio-9095-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Written [UP {}] as "application/vnd.spring-boot.actuator.v1+json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@144409aa]
2020-05-06 17:14:01.849 DEBUG 58588 --- [nio-9095-exec-5] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2020-05-06 17:14:01.849 DEBUG 58588 --- [nio-9095-exec-5] o.s.web.servlet.DispatcherServlet        : Successfully completed request

我需要设置不同的日志记录器属性吗?针对不同的类/包?


好的,根据那个配置,我会期望看到那个输出。你想要关闭哪行输出?其中4行是来自DispactcherServlet,而你将org.springframework.web设置为DEBUG,另外一行来自RequestResponseBodyMethodProcessor,也在org.springframework.web中。 - James Gawron
@JamesGawron 感谢您的回复。没错。我的理解是,从执行器框架中关闭/health的日志记录将防止任何日志记录命中它,包括DispatcherServlet和RequestResponseBodyMethod。是的,将'logging.level.org.springframework'设置为除DEBUG以外的其他级别将防止它,但这将阻止所有其他DEBUGS,不想要那样。'/health'将从f5用作监视器,每15-20秒钟命中一次,因此如果可能,最好不要让这些输出淹没日志。也许我做错了什么。 - neel21
你找到解决方法了吗?我也很想实现这个。 - Vinagy
我正在寻找相同的东西。有人找到了方法吗? - polavishnu
我也遇到了同样的问题。有人找到解决方法了吗? - Pallavi Singh
1个回答

5

我使用Logback,因此我添加了一个用于日志的过滤器。您需要更改正则表达式以匹配自己的日志格式。

package eu.stackoverflow.logging;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;

public class IgnoringHealthAndPrometheusLoggingFilter extends Filter<ILoggingEvent> {

    private static final Pattern HEALTH_OR_PROMETHEUS =
        Pattern.compile("GET \"/(health|prometheus)\", parameters=\\{}");
    private static final Pattern COMPLETED =
        Pattern.compile("Completed 200 OK");

    private Set<String> activeThreads = new HashSet<>();

    @Override
    public FilterReply decide(ILoggingEvent loggingEvent) {
        if (isHealthOrPrometheus(loggingEvent.getMessage())) {
            activeThreads.add(loggingEvent.getThreadName());
            return FilterReply.DENY;
        } else if (isCompleted200Ok(loggingEvent.getMessage()) && activeThreads.remove(loggingEvent.getThreadName())) {
            return FilterReply.DENY;
        } else {
            return FilterReply.ACCEPT;
        }
    }

    private boolean isHealthOrPrometheus(String message) {
        return HEALTH_OR_PROMETHEUS.matcher(message).matches();
    }

    private boolean isCompleted200Ok(String message) {
        return COMPLETED.matcher(message).matches();
    }
}

    <appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
        <filter class="eu.stackoverflow.logging.IgnoringHealthAndPrometheusLoggingFilter" />
    </appender>

更多关于logback过滤器的信息:https://logback.qos.ch/manual/filters.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接