2024年如何通过代码设置/禁用gRPC Java日志?
gRPC Java日志配置相关问题
背景
早年资料显示gRPC使用java.util.Logging,可通过Logger.getLogger("io.grpc").setLevel(Level.INFO)设置日志级别。我尝试遍历JDK日志管理器的所有日志器并禁用日志,代码如下:
java.util.logging.Logger logger; Enumeration<String> iter = java.util.logging .LogManager .getLogManager() .getLoggerNames(); while (iter.hasMoreElements()) { String loggerName = iter.nextElement(); System.out.println(loggerName); // 查看哪些日志器在输出 logger = java.util.logging.Logger.getLogger(loggerName); logger.setLevel(Level.OFF); for (Handler h : logger.getHandlers()) { h.setLevel(Level.OFF); } }
但执行后仍有大量io.netty相关的DEBUG日志输出,直到关闭Log4j2根日志(this.logger.getRootLogger().setLevel(Level.OFF);)才成功关闭所有日志。
疑问
Q1. gRPC当前是否已改用Log4j2而非JDK标准日志工具?
Q2. 如何通过代码正确设置/禁用gRPC Java日志,同时关闭Netty相关日志?
解答
Q1:gRPC是否改用Log4j2?
gRPC Java本身并没有直接绑定Log4j2,它使用SLF4J作为日志门面,默认适配多种日志实现:
- 类路径存在JUL(
java.util.logging)的SLF4J桥接器时,会使用JUL; - 存在Log4j2的SLF4J绑定,则会切换到Log4j2输出;
- 同时也支持Logback等其他日志框架。
你遇到的情况,应该是项目中引入了Log4j2的SLF4J绑定依赖,导致gRPC的日志最终通过Log4j2输出,而非直接使用JUL。
Q2:代码方式正确禁用gRPC及Netty日志
根据项目使用的日志框架不同,分两种场景处理:
场景1:项目使用Log4j2(你的情况)
直接通过Log4j2 API调整对应包的日志级别即可,无需处理JUL:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.Level; // 获取Log4j2上下文 LoggerContext context = (LoggerContext) LogManager.getContext(false); // 禁用gRPC日志 context.getConfiguration().getLoggerConfig("io.grpc").setLevel(Level.OFF); // 禁用Netty日志 context.getConfiguration().getLoggerConfig("io.netty").setLevel(Level.OFF); // 刷新配置使其生效 context.updateLoggers();
如果需要快速关闭所有日志,也可以直接操作根日志,但更推荐精准控制特定包,避免影响其他业务日志:
LogManager.getRootLogger().setLevel(Level.OFF);
场景2:项目使用JUL(无其他日志绑定)
JUL的日志器会继承父日志器级别,且你之前的代码可能遗漏了动态创建的日志器(比如Netty的日志器可能在遍历后才初始化)。可以直接针对特定包强制设置级别,同时关闭根日志器:
import java.util.logging.Level; import java.util.logging.Logger; // 禁用gRPC日志 Logger.getLogger("io.grpc").setLevel(Level.OFF); // 禁用Netty日志 Logger.getLogger("io.netty").setLevel(Level.OFF); // 关闭根日志器,避免遗漏未覆盖的子日志器 Logger.getLogger("").setLevel(Level.OFF);
也可以通过启动时的系统属性配置,这种方式更可靠:
-Djava.util.logging.config.file=logging.properties
在logging.properties文件中添加:
io.grpc.level = OFF io.netty.level = OFF .level = OFF
内容的提问来源于stack exchange,提问作者nawK
相关产品推荐
相关产品推荐

