Skip to content
This repository was archived by the owner on Feb 11, 2025. It is now read-only.

Commit 3549707

Browse files
authored
Merge pull request #8 from mateusscheper/editable_logging_levels
Allow the user to change log levels to info, warning, error or debug.
2 parents 71948a9 + f1aa916 commit 3549707

File tree

6 files changed

+152
-24
lines changed

6 files changed

+152
-24
lines changed

src/main/java/dev/ai4j/openai4j/DefaultOpenAiClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ private DefaultOpenAiClient(Builder serviceBuilder) {
6969
}
7070

7171
if (serviceBuilder.logRequests) {
72-
okHttpClientBuilder.addInterceptor(new RequestLoggingInterceptor());
72+
okHttpClientBuilder.addInterceptor(new RequestLoggingInterceptor(serviceBuilder.logLevel));
7373
}
74+
7475
if (serviceBuilder.logResponses) {
75-
okHttpClientBuilder.addInterceptor(new ResponseLoggingInterceptor());
76+
okHttpClientBuilder.addInterceptor(new ResponseLoggingInterceptor(serviceBuilder.logLevel));
7677
}
7778
this.logStreamingResponses = serviceBuilder.logStreamingResponses;
7879

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.ai4j.openai4j;
2+
3+
public enum LogLevel {
4+
5+
INFO,
6+
WARN,
7+
ERROR,
8+
DEBUG
9+
}

src/main/java/dev/ai4j/openai4j/OpenAiClient.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public abstract static class Builder<T extends OpenAiClient, B extends Builder<T
6767
public Proxy proxy;
6868
public boolean logRequests;
6969
public boolean logResponses;
70+
public LogLevel logLevel;
7071
public boolean logStreamingResponses;
7172
public Path persistTo;
7273

@@ -187,6 +188,14 @@ public B logRequests(Boolean logRequests) {
187188
return (B) this;
188189
}
189190

191+
public B logLevel(LogLevel logLevel) {
192+
if (logLevel == null) {
193+
logLevel = LogLevel.DEBUG;
194+
}
195+
this.logLevel = logLevel;
196+
return (B) this;
197+
}
198+
190199
public B logResponses() {
191200
return logResponses(true);
192201
}

src/main/java/dev/ai4j/openai4j/RequestLoggingInterceptor.java

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,88 @@
1818
class RequestLoggingInterceptor implements Interceptor {
1919

2020
private static final Logger log = LoggerFactory.getLogger(RequestLoggingInterceptor.class);
21+
private LogLevel logLevel = LogLevel.DEBUG;
2122

2223
private static final Pattern BEARER_PATTERN = Pattern.compile("(Bearer\\s*sk-)(\\w{2})(\\w+)(\\w{2})");
2324

25+
public RequestLoggingInterceptor() {
26+
}
27+
28+
public RequestLoggingInterceptor(LogLevel logLevel) {
29+
this.logLevel = logLevel;
30+
}
31+
2432
@Override
2533
public Response intercept(Chain chain) throws IOException {
26-
2734
Request request = chain.request();
2835

2936
log(request);
3037

3138
return chain.proceed(request);
3239
}
3340

34-
private static void log(Request request) {
41+
private void log(Request request) {
42+
String message = "Request:\n- method: {}\n- url: {}\n- headers: {}\n- body: {}";
43+
3544
try {
36-
log.debug("Request:\n- method: {}\n- url: {}\n- headers: {}\n- body: {}",
37-
request.method(),
38-
request.url(),
39-
inOneLine(request.headers()),
40-
getBody(request)
41-
);
45+
switch (logLevel) {
46+
case INFO:
47+
logInfo(request, message);
48+
break;
49+
case WARN:
50+
logWarn(request, message);
51+
break;
52+
case ERROR:
53+
logError(request, message);
54+
break;
55+
default:
56+
logDebug(request, message);
57+
}
4258
} catch (Exception e) {
4359
log.warn("Failed to log request", e);
4460
}
4561
}
4662

63+
private void logInfo(Request request, String message) {
64+
log.info(
65+
message,
66+
request.method(),
67+
request.url(),
68+
inOneLine(request.headers()),
69+
getBody(request)
70+
);
71+
}
72+
73+
private void logWarn(Request request, String message) {
74+
log.warn(
75+
message,
76+
request.method(),
77+
request.url(),
78+
inOneLine(request.headers()),
79+
getBody(request)
80+
);
81+
}
82+
83+
private void logError(Request request, String message) {
84+
log.error(
85+
message,
86+
request.method(),
87+
request.url(),
88+
inOneLine(request.headers()),
89+
getBody(request)
90+
);
91+
}
92+
93+
private void logDebug(Request request, String message) {
94+
log.debug(
95+
message,
96+
request.method(),
97+
request.url(),
98+
inOneLine(request.headers()),
99+
getBody(request)
100+
);
101+
}
102+
47103
static String inOneLine(Headers headers) {
48104

49105
return stream(headers.spliterator(), false)
@@ -62,7 +118,6 @@ static String inOneLine(Headers headers) {
62118

63119
private static String maskAuthorizationHeaderValue(String authorizationHeaderValue) {
64120
try {
65-
66121
Matcher matcher = BEARER_PATTERN.matcher(authorizationHeaderValue);
67122

68123
StringBuffer sb = new StringBuffer();

src/main/java/dev/ai4j/openai4j/ResponseLoggingInterceptor.java

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,17 @@ class ResponseLoggingInterceptor implements Interceptor {
1414

1515
private static final Logger log = LoggerFactory.getLogger(ResponseLoggingInterceptor.class);
1616

17+
private LogLevel logLevel = LogLevel.DEBUG;
18+
19+
public ResponseLoggingInterceptor() {
20+
}
21+
22+
public ResponseLoggingInterceptor(LogLevel logLevel) {
23+
this.logLevel = logLevel;
24+
}
25+
1726
@Override
1827
public Response intercept(Chain chain) throws IOException {
19-
2028
Request request = chain.request();
2129
Response response = chain.proceed(request);
2230

@@ -25,28 +33,74 @@ public Response intercept(Chain chain) throws IOException {
2533
return response;
2634
}
2735

28-
static void log(Response response) {
36+
void log(Response response) {
37+
String message = "Response:\n- status code: {}\n- headers: {}\n- body: {}";
38+
2939
try {
30-
log.debug(
31-
"Response:\n- status code: {}\n- headers: {}\n- body: {}",
32-
response.code(),
33-
inOneLine(response.headers()),
34-
getBody(response)
35-
);
40+
switch (logLevel) {
41+
case INFO:
42+
logInfo(response, message);
43+
break;
44+
case WARN:
45+
logWarn(response, message);
46+
break;
47+
case ERROR:
48+
logError(response, message);
49+
break;
50+
default:
51+
logDebug(response, message);
52+
}
53+
3654
} catch (IOException e) {
3755
log.warn("Failed to log response", e);
3856
}
3957
}
4058

41-
private static String getBody(Response response) throws IOException {
59+
private void logError(Response response, String message) throws IOException {
60+
log.error(
61+
message,
62+
response.code(),
63+
inOneLine(response.headers()),
64+
getBody(response)
65+
);
66+
}
67+
68+
private void logWarn(Response response, String message) throws IOException {
69+
log.warn(
70+
message,
71+
response.code(),
72+
inOneLine(response.headers()),
73+
getBody(response)
74+
);
75+
}
76+
77+
private void logInfo(Response response, String message) throws IOException {
78+
log.info(
79+
message,
80+
response.code(),
81+
inOneLine(response.headers()),
82+
getBody(response)
83+
);
84+
}
85+
86+
private void logDebug(Response response, String message) throws IOException {
87+
log.debug(
88+
message,
89+
response.code(),
90+
inOneLine(response.headers()),
91+
getBody(response)
92+
);
93+
}
94+
95+
private String getBody(Response response) throws IOException {
4296
if (isEventStream(response)) {
4397
return "[skipping response body due to streaming]";
4498
} else {
4599
return response.peekBody(Long.MAX_VALUE).string();
46100
}
47101
}
48102

49-
private static boolean isEventStream(Response response) {
103+
private boolean isEventStream(Response response) {
50104
String contentType = response.header("content-type");
51105
return contentType != null && contentType.contains("event-stream");
52106
}

src/main/java/dev/ai4j/openai4j/StreamingRequestExecutor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.util.function.Function;
1515
import java.util.function.Supplier;
1616

17-
import static dev.ai4j.openai4j.ResponseLoggingInterceptor.log;
1817
import static dev.ai4j.openai4j.Utils.toException;
1918

2019
class StreamingRequestExecutor<Request, Response, ResponseContent> {
@@ -27,6 +26,7 @@ class StreamingRequestExecutor<Request, Response, ResponseContent> {
2726
private final Class<Response> responseClass;
2827
private final Function<Response, ResponseContent> streamEventContentExtractor;
2928
private final boolean logStreamingResponses;
29+
private final ResponseLoggingInterceptor responseLogger = new ResponseLoggingInterceptor();
3030

3131
StreamingRequestExecutor(
3232
OkHttpClient okHttpClient,
@@ -151,7 +151,7 @@ public void onOpen(EventSource eventSource, okhttp3.Response response) {
151151
}
152152

153153
if (logStreamingResponses) {
154-
log(response);
154+
responseLogger.log(response);
155155
}
156156
}
157157

@@ -202,7 +202,7 @@ public void onFailure(EventSource eventSource, Throwable t, okhttp3.Response res
202202

203203
if (logStreamingResponses) {
204204
log.debug("onFailure()", t);
205-
log(response);
205+
responseLogger.log(response);
206206
}
207207

208208
if (t != null) {

0 commit comments

Comments
 (0)