能否将Logbook日志级别设置为高于TRACE?INFO级别配置无效问题求助
问题核心解析
你遇到的问题本质是Logbook的默认设计逻辑和你配置的理解偏差:
官方文档要求设为TRACE级别,是因为Logbook内部输出请求/响应日志时,默认使用的就是TRACE级别。而你配置的logbook.write.level=INFO,其实是设置Logbook的日志过滤阈值(只有级别≥INFO的日志才会被允许写入)——但Logbook本身输出的请求日志是TRACE级(低于INFO),所以直接被过滤掉了;同时logging.level.org.zalando.logbook=INFO会让日志框架直接丢弃所有TRACE级日志,自然看不到任何输出。
解决方法
下面提供两种可行方案,根据你的需求选择:
方案一:自定义Logbook日志写入器(推荐,灵活可控)
通过自定义LogWriter Bean,替换默认实现,让Logbook用INFO级别输出请求/响应日志:
- 创建配置类,实现自定义写入器:
import org.zalando.logbook.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class LogbookCustomConfig { private static final Logger LOGBOOK_LOG = LoggerFactory.getLogger(Logbook.class); @Bean public LogWriter infoLevelLogWriter() { return new LogWriter() { // 处理请求日志 @Override public void write(Precorrelation precorrelation, HttpRequest request) { if (LOGBOOK_LOG.isInfoEnabled()) { // 基础请求信息 LOGBOOK_LOG.info("Request [{}] {} {}", precorrelation.getId(), request.getMethod(), request.getRequestUri()); // 可选:输出请求体(注意大小限制) if (request.hasBody()) { LOGBOOK_LOG.info("Request Body [{}]: {}", precorrelation.getId(), request.getBodyAsString()); } } } // 处理响应日志 @Override public void write(Correlation correlation, HttpResponse response) { if (LOGBOOK_LOG.isInfoEnabled()) { // 基础响应信息 LOGBOOK_LOG.info("Response [{}] {} | Duration: {}ms", correlation.getId(), response.getStatus(), correlation.getDuration().toMillis()); // 可选:输出响应体(注意大小限制) if (response.hasBody()) { LOGBOOK_LOG.info("Response Body [{}]: {}", correlation.getId(), response.getBodyAsString()); } } } }; } }
- 修改
application.yml配置:
logbook: exclude: - /swagger-ui.html - /schema/** - /health - /favicon.ico - /togglz-console/** filter.enabled: true format.style: json write: max-body-size: 8192 logging: level: org.zalando.logbook: INFO
这样自定义写入器会直接用INFO级别输出日志,日志框架设置为INFO后就能正常打印。
方案二:Logback级别映射(无需大量代码修改)
通过Logback的转换器,把Logbook输出的TRACE级别日志在显示时映射为INFO,同时保持Logbook的内部配置要求:
- 在
logback-spring.xml中添加配置:
<configuration> <!-- 允许Logbook的TRACE日志被接收 --> <logger name="org.zalando.logbook" level="TRACE"/> <!-- 自定义级别转换器,把Logbook的TRACE转为INFO显示 --> <turboFilter class="ch.qos.logback.classic.turbo.MatchingFilter"> <logger>org.zalando.logbook</logger> <level>TRACE</level> <onMatch>ACCEPT</onMatch> <onMismatch>NEUTRAL</onMismatch> </turboFilter> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <conversionRule conversionWord="level" converterClass="com.yourpackage.LogbookLevelConverter"/> </layout> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
- 创建转换器类:
import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi.ILoggingEvent; public class LogbookLevelConverter extends ClassicConverter { @Override public String convert(ILoggingEvent event) { // 仅针对Logbook的TRACE日志,显示为INFO if ("org.zalando.logbook".equals(event.getLoggerName()) && event.getLevel().equals(ch.qos.logback.classic.Level.TRACE)) { return "INFO"; } return event.getLevel().toString(); } }
这种方式既能满足Logbook内部需要TRACE级别的要求,又能让日志显示为INFO级别。
内容的提问来源于stack exchange,提问作者PureVodka
相关产品推荐
相关产品推荐

