如何抑制gRPC内部Netty产生的异常INFO日志?
抑制gRPC Netty的HTTP/1请求INFO日志解决方案
核心问题:gRPC Java默认使用Java Util Logging(JUL)输出日志,若未将JUL桥接到SLF4J,你的simpleLogger配置无法控制gRPC的日志行为;同时需要精准指定目标日志类/包的级别。
步骤1:桥接JUL到SLF4J
让gRPC的日志转发到SLF4J,遵循你的日志配置:
添加依赖
根据构建工具添加对应依赖(版本需与项目中slf4j-api一致):
- Maven:
<dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>你的SLF4J版本号</version> </dependency>
- Gradle:
implementation 'org.slf4j:jul-to-slf4j:你的SLF4J版本号'
初始化桥接
在应用启动的main方法开头添加以下代码,完成JUL到SLF4J的转发配置:
import org.slf4j.bridge.SLF4JBridgeHandler; public class YourGrpcServerMain { public static void main(String[] args) { // 移除JUL默认处理器,避免日志重复输出 SLF4JBridgeHandler.removeHandlersForRootLogger(); // 安装SLF4J桥接器,将JUL日志转发到SLF4J SLF4JBridgeHandler.install(); // 启动你的gRPC服务逻辑 // ... } }
步骤2:精准设置日志级别
通过以下两种方式之一,将io.grpc.netty相关的日志级别设为WARN,抑制INFO级的无效请求日志:
方式1:命令行参数修改
在原有JVM参数基础上,添加指定包的日志级别:
-Dorg.slf4j.simpleLogger.defaultLogLevel=warn -Dorg.slf4j.simpleLogger.log.com.foo.bar=info -Dorg.slf4j.simpleLogger.log.io.grpc.netty=warn
若需更精准控制,可直接指定产生日志的类:
-Dorg.slf4j.simpleLogger.defaultLogLevel=warn -Dorg.slf4j.simpleLogger.log.com.foo.bar=info -Dorg.slf4j.simpleLogger.log.io.grpc.netty.NettyServerTransport=warn
方式2:配置文件管理
在项目classpath下创建simplelogger.properties文件,内容如下:
org.slf4j.simpleLogger.defaultLogLevel=warn org.slf4j.simpleLogger.log.com.foo.bar=info org.slf4j.simpleLogger.log.io.grpc.netty=warn
这种方式更易维护,无需在命令行传递冗长参数。
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

