如何记录Pac4j发往Keycloak的所有HTTP出站连接?
问题
我使用javaee-pac4j-8与Java17,在Keycloak中启用OIDC登录,在实现ConfigFactory的类中使用KeycloakOidcClient。想记录Pac4j发往Keycloak的所有出站连接,这些请求包括:
- 交换授权码获取令牌
- 用刷新令牌获取新令牌
- 获取用户信息
我使用log4j,只能开启少量特定类的DEBUG日志(全量日志太大)。请问重写默认ProxySelector是否可行?我认为Nimbusds使用HttpURLConnection,以下代码是否能实现需求?
public void registerGlobalInterceptor() { final ProxySelector defaultSelector = ProxySelector.getDefault(); ProxySelector interceptorSelector = new ProxySelector() { @Override public List<Proxy> select(URI uri) { if (uri.getHost() != null && uri.getHost().contains("CHANGE-ME-IAM-TEST")) { System.out.println(">>>> [Token/API] call to Keycloak: " + uri); } return (defaultSelector != null) ? defaultSelector.select(uri) : Collections.singletonList(Proxy.NO_PROXY); } @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { if (defaultSelector != null) { defaultSelector.connectFailed(uri, sa, ioe); } } }; ProxySelector.setDefault(interceptorSelector); }
回答
重写ProxySelector的可行性
这个思路是可行的,因为Nimbus OIDC库确实依赖HttpURLConnection,而ProxySelector是Java全局处理HTTP连接代理选择的机制,通过它能拦截到所有发往Keycloak的请求URI。不过你的代码有几个可以优化的点:
- 把
System.out.println换成log4j的日志输出,比如logger.debug(">>>> [Token/API] call to Keycloak: {}", uri);,统一日志管理,方便后续排查问题。 - 建议把Keycloak域名设为常量,比如
private static final String KEYCLOAK_HOST = "your-keycloak-domain.com";,然后用uri.getHost().equals(KEYCLOAK_HOST)判断,比contains更精准,避免误匹配其他含相同字符串的域名。 - 注意全局设置
ProxySelector会影响整个应用的HTTP连接,要确保只针对Keycloak的请求做日志,别干扰其他业务请求。
更推荐的日志方案:针对特定类开启DEBUG
既然用log4j,其实可以直接针对Pac4j/Nimbus中负责发送请求的类开启DEBUG日志,不用写代码就能实现需求,还更精准:
- 针对令牌交换、刷新请求,开启
com.nimbusds.oauth2.sdk包的DEBUG日志,这个包负责处理OIDC核心的令牌交互逻辑。 - 针对用户信息请求,开启
com.nimbusds.openid.connect.sdk的DEBUG日志。 - Pac4j层面可以开启
org.pac4j.oidc.client包的DEBUG日志,能记录客户端发起的请求信息。
你可以在log4j配置文件中添加如下配置:
<Logger name="com.nimbusds.oauth2.sdk" level="DEBUG" additivity="false"> <AppenderRef ref="YourAppender"/> </Logger> <Logger name="org.pac4j.oidc.client" level="DEBUG" additivity="false"> <AppenderRef ref="YourAppender"/> </Logger>
这样只会输出和OIDC请求相关的日志,不会产生全量日志的问题。
总结
- 你提供的ProxySelector代码可以实现记录Keycloak出站连接的需求,但需要调整日志输出方式和域名判断逻辑。
- 更推荐使用log4j针对特定类开启DEBUG日志的方案,更简洁且侵入性更低。
内容的提问来源于stack exchange,提问作者Borneo777
相关产品推荐
相关产品推荐

