Closed OrezzerO closed 5 years ago
@OrezzerO 这里使用 SOFA RPC 自己内置的 com.alipay.sofa.rpc.log.Logger
更合适,内置 Logger 的实现会通过用户环境内依赖的日志实现 jar 来自动选择,这里应该是漏掉了,可以提个 PR Fix 这个问题么?
@JervyShi 我觉得这么处理还是不够的, 因为 resteasy 内部是用org.jboss.resteasy.logging.Logger
,光改掉这个类是不够的.
我的想法是把 com.alipay.sofa.rpc.log.Logger
和org.jboss.resteasy.logging.Logger
使用的具体的日志实现类指定成一样的
@OrezzerO 是说框架主动做 Logger.setLoggerType(Logger.LoggerType.SLF4J);
吗?这种方式对用户不太友好,选择权还是应该在用户手中,按照 org.jboss.resteasy.logging.Logger
的实现逻辑,只有应用内有 org.apache.log4j.Logger
时才会启用,所以可以主动排除掉项目中 log4j 的依赖吧,然后就走到 SLF4J 了。
@JervyShi 并不是说直接指定SLF4J
而是说,org.jboss.resteasy.logging.Logger
和com.alipay.sofa.rpc.log.Logger
行为一致, com.alipay.sofa.rpc.log.Logger
指定slf4j,那么org.jboss.resteasy.logging.Logger
也是指定 slf4j. com.alipay.sofa.rpc.log.Logger
指定log4j,那么org.jboss.resteasy.logging.Logger
也是指定 log4j.
作为框架的提供者,我们不应该规定用户用什么日志实现,同样的,我们也不能保证用户是否同时依赖多个日志框架/(ㄒoㄒ)/~~
Your question
业务代码抛出异常之后,框架没有打印异常堆栈
Rest 协议异常请求流程
SofaRestRequestHandler 兜底处理异常,打印异常堆栈
然而,SofaRestRequestHandler 中的 logger 是由
org.jboss.resteasy.logging.Logger
这个特殊的 Logger 构造出来的. 如果不指定日志实现, 这个 Logger 的日志实现是由以下代码指定的:可以看出,Log4j 的优先级是高于 SLF4j 的. 我们很难在依赖中完全去除
org.apache.log4j.Logger
这就导致了我们整体上使用 Logback,SofaRestRequestHandler
这个类以及 resteasy 相关类中的日志依然使用log4j
打印.解决方案
显示指定 resteasy 使用的日志框架:
Environment
java -version
):uname -a
):