|
12 | 12 | import lombok.Getter; |
13 | 13 | import lombok.extern.slf4j.Slf4j; |
14 | 14 | import okhttp3.*; |
| 15 | +import okhttp3.extension.logging.HttpLogLevel; |
15 | 16 |
|
16 | 17 | import java.io.IOException; |
17 | 18 | import java.nio.charset.StandardCharsets; |
@@ -94,11 +95,13 @@ private HermesHttpClient(HermesHttpClientConfig config, ObjectMapper objectMappe |
94 | 95 | .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) : objectMapper; |
95 | 96 | this.httpClient = Objects.requireNonNull(httpClient, "httpClient"); |
96 | 97 | this.ownsHttpClient = ownsHttpClient; |
97 | | - log.debug("Hermes HTTP client initialized: baseUrl={}, connectTimeoutMs={}, readTimeoutMs={}, " |
98 | | - + "callTimeoutMs={}, retryOnConnectionFailure={}, detailedLoggingEnabled={}", |
99 | | - config.getBaseUrl(), config.getConnectTimeoutMillis(), config.getReadTimeoutMillis(), |
100 | | - config.getCallTimeoutMillis(), config.isRetryOnConnectionFailure(), |
101 | | - config.isDetailedLoggingEnabled()); |
| 98 | + if (allows(HttpLogLevel.BASIC)) { |
| 99 | + log.debug("Hermes HTTP client initialized: baseUrl={}, connectTimeoutMs={}, readTimeoutMs={}, " |
| 100 | + + "callTimeoutMs={}, retryOnConnectionFailure={}, debugLevel={}", |
| 101 | + config.getBaseUrl(), config.getConnectTimeoutMillis(), config.getReadTimeoutMillis(), |
| 102 | + config.getCallTimeoutMillis(), config.isRetryOnConnectionFailure(), |
| 103 | + config.getDebug().getLevel()); |
| 104 | + } |
102 | 105 | } |
103 | 106 |
|
104 | 107 | // ============================================================ |
@@ -906,7 +909,9 @@ private void closeRegistration(AutoCloseable registration) { |
906 | 909 | try { |
907 | 910 | registration.close(); |
908 | 911 | } catch (Exception error) { |
909 | | - log.debug("Failed to unregister HTTP cancellation callback: {}", error.getMessage()); |
| 912 | + if (allows(HttpLogLevel.BASIC)) { |
| 913 | + log.debug("Failed to unregister HTTP cancellation callback: {}", error.getMessage()); |
| 914 | + } |
910 | 915 | } |
911 | 916 | } |
912 | 917 |
|
@@ -984,19 +989,25 @@ private boolean isSuccessful() { |
984 | 989 | private long beginTrace(Request request) { |
985 | 990 | // 原子序列只用于 JVM 内关联请求生命周期日志,不改变协议与重试语义。 |
986 | 991 | long requestId = REQUEST_SEQUENCE.incrementAndGet(); |
987 | | - log.debug("HTTP request started: requestId={}, method={}, url={}", |
988 | | - requestId, request.method(), request.url()); |
989 | | - if (config.isDetailedLoggingEnabled()) { |
990 | | - log.debug("HTTP request details: requestId={}, headers={}, body={}", requestId, |
991 | | - redactHeaders(request.headers()), requestBody(request)); |
| 992 | + if (allows(HttpLogLevel.BASIC)) { |
| 993 | + log.debug("HTTP request started: requestId={}, method={}, url={}", |
| 994 | + requestId, request.method(), request.url()); |
| 995 | + } |
| 996 | + if (allows(HttpLogLevel.HEADERS)) { |
| 997 | + log.debug("HTTP request headers: requestId={}, headers={}", requestId, redactHeaders(request.headers())); |
| 998 | + } |
| 999 | + if (allows(HttpLogLevel.BODY)) { |
| 1000 | + log.debug("HTTP request body: requestId={}, body={}", requestId, requestBody(request)); |
992 | 1001 | } |
993 | 1002 | return requestId; |
994 | 1003 | } |
995 | 1004 |
|
996 | 1005 | private void logResponse(long requestId, Request request, int status, String body, long startedAt) { |
997 | | - log.debug("HTTP request completed: requestId={}, method={}, url={}, status={}, bodyLength={}, elapsedMs={}", |
998 | | - requestId, request.method(), request.url(), status, body.length(), elapsedMillis(startedAt)); |
999 | | - if (config.isDetailedLoggingEnabled()) { |
| 1006 | + if (allows(HttpLogLevel.BASIC)) { |
| 1007 | + log.debug("HTTP request completed: requestId={}, method={}, url={}, status={}, bodyLength={}, elapsedMs={}", |
| 1008 | + requestId, request.method(), request.url(), status, body.length(), elapsedMillis(startedAt)); |
| 1009 | + } |
| 1010 | + if (allows(HttpLogLevel.BODY)) { |
1000 | 1011 | log.debug("HTTP response body: requestId={}, body={}", requestId, truncate(body)); |
1001 | 1012 | } |
1002 | 1013 | } |
@@ -1024,16 +1035,20 @@ private String requestBody(Request request) { |
1024 | 1035 | } |
1025 | 1036 |
|
1026 | 1037 | private String truncate(String value) { |
1027 | | - int limit = Math.max(0, config.getMaxLoggedBodyLength()); |
| 1038 | + int limit = config.getDebug().resolveMaxContentLength(); |
1028 | 1039 | return value.length() <= limit ? value : value.substring(0, limit) + "...<truncated>"; |
1029 | 1040 | } |
1030 | 1041 |
|
| 1042 | + private boolean allows(HttpLogLevel level) { |
| 1043 | + return config.getDebug().allows(level); |
| 1044 | + } |
| 1045 | + |
1031 | 1046 | private Headers redactHeaders(Headers headers) { |
1032 | 1047 | Headers.Builder safe = headers.newBuilder(); |
1033 | 1048 | for (String name : headers.names()) { |
1034 | 1049 | String lowerName = name.toLowerCase(); |
1035 | 1050 | if ("authorization".equals(lowerName) || lowerName.contains("token") || lowerName.contains("key")) { |
1036 | | - safe.set(name, "██"); |
| 1051 | + safe.set(name, "<redacted>"); |
1037 | 1052 | } |
1038 | 1053 | } |
1039 | 1054 | return safe.build(); |
|
0 commit comments