Firebase Admin SDK Google HTTP 客户端请求和响应日志记录

Firebase Admin SDK Google HTTP Client Request and Response logging

Firebase Admin SDK 通过 slf4j 使用日志记录,我的项目已使用 Log4j2 设置。通常我通过使用特定日志记录逻辑包裹 RestTemplate 的自定义客户端进行集成,以特定标准化格式(通过 xml 定义)记录 http 请求和响应。

问题是现在我偶然发现了一个我实际上可以使用 SDK 的集成,但问题是我的日志记录不太容易与 Google HTTP 客户端兼容。我浏览了各种网站以寻找好的做法,但不幸的是我没有找到任何有形的东西。

如何为 Google HTTP Client 设置 Log4j2 file appender 以输出标准化格式的请求和响应日志? 感谢您的良好实践和指向新的要点知识.

一个选项是向此 class 添加一个日志记录处理程序: com.google.api.client.http.HttpTransportdocumentation 中概述了类似的方法,并从日志记录中提取请求和响应数据。这种方法的问题是数据是文本格式,毕竟是日志记录,需要重新解析。

我认为在这种情况下最安全和最灵活的方法是利用库提供的请求和拦截器功能。因此,我们可以在请求前后添加自己的日志记录逻辑。这样所有请求和响应数据都可用。

下面是一些示例代码:

import com.google.api.client.http.*;
import com.google.api.client.http.javanet.NetHttpTransport;

import java.io.IOException;

public class MyLogger {
    static class MyInitializer implements HttpResponseInterceptor, HttpRequestInitializer, HttpExecuteInterceptor {

        @Override
        public void interceptResponse(HttpResponse response) throws IOException {
            // perform response logging here
            var request = response.getRequest();
            System.out.println(
                "RESPONSE: " + request.getRequestMethod() + " " + request.getUrl() + " " + response.getStatusCode()
            );

        }

        @Override
        public void initialize(HttpRequest request) throws IOException {
            request.setResponseInterceptor(this);
            request.setInterceptor(this);

        }

        @Override
        public void intercept(HttpRequest request) throws IOException {
            // perform request logging here
            System.out.println("REQUEST: " + request.getRequestMethod() + " " + request.getUrl());
        }
    }

    public static void main(String[] args) throws IOException {
      HttpTransport httpTransport = new NetHttpTransport();
      HttpRequestFactory requestFactory = httpTransport.createRequestFactory(new MyInitializer());
      var request = requestFactory.buildGetRequest(new GenericUrl("http://example.com"));
      request.execute();
    }
}