-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathAbstractLogger.java
More file actions
150 lines (132 loc) · 4.72 KB
/
AbstractLogger.java
File metadata and controls
150 lines (132 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* Copyright 2019-2020 OpenFeign Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package feign.logging;
import feign.Header;
import feign.Logger;
import feign.Request;
import feign.Response;
import feign.retry.RetryContext;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.StringJoiner;
/**
* Base Logger implementation.
*/
public abstract class AbstractLogger implements Logger {
private final boolean enabled;
private final boolean requestEnabled;
private final boolean responseEnabled;
private final boolean headersEnabled;
/**
* Creates a new Abstract Logger.
*
* @param enabled flag.
* @param requestEnabled flag.
* @param responseEnabled flag.
* @param headersEnabled flag.
*/
protected AbstractLogger(boolean enabled, boolean requestEnabled, boolean responseEnabled,
boolean headersEnabled) {
this.enabled = enabled;
this.requestEnabled = requestEnabled;
this.responseEnabled = responseEnabled;
this.headersEnabled = headersEnabled;
}
@Override
public void logRequest(String methodName, Request request) {
if (this.enabled) {
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("uri=" + request.uri());
joiner.add("method=" + request.method());
if (this.headersEnabled) {
for (Header header : request.headers()) {
StringJoiner headers = new StringJoiner(", ", "[", "]");
this.logHeader(header, headers);
joiner.add("headers=" + headers.toString());
}
}
if (this.requestEnabled) {
int length = request.contentLength();
joiner.add("size=" + length);
if (length != 0) {
if (length < 512) {
/* create a new String to hold the body */
String body = new String(request.content(), StandardCharsets.UTF_8);
joiner.add("body=" + body);
} else {
/* requests that are too large are not logged */
joiner.add("body=binary data");
}
}
}
this.log(methodName, "Request: " + joiner.toString());
}
}
@Override
public void logResponse(String methodName, Response response) {
if (this.enabled) {
StringJoiner joiner = new StringJoiner(", ", "[", "]");
this.getResponseLogMessage(joiner, response);
if (this.responseEnabled) {
int length = response.contentLength();
if (length > 0) {
if (length < 512) {
try {
/* this forces us to read the entire response before logging */
String body = new String(response.toByteArray(), StandardCharsets.UTF_8);
joiner.add("body=" + body);
} catch (IOException io) {
this.log(methodName,
"IOException occurred when reading Response. " + io.getMessage());
}
} else {
joiner.add("body=binary data");
}
}
}
this.log(methodName, "Response: " + joiner.toString());
}
}
@Override
public void logRetry(String methodName, RetryContext context) {
if (this.enabled) {
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("attempts=" + context.getAttempts());
context.getResponse().ifPresent(response -> getResponseLogMessage(joiner, response));
context.getLastException().ifPresent(throwable -> {
joiner.add("exception=" + throwable.getClass().getSimpleName());
joiner.add("message=" + throwable.getMessage());
});
this.log(methodName, joiner.toString());
}
}
private void getResponseLogMessage(StringJoiner joiner, Response response) {
joiner.add("status=" + response.status());
joiner.add("reason=" + response.reason());
joiner.add("length=" + response.contentLength());
if (this.headersEnabled) {
for (Header header : response.headers()) {
StringJoiner headers = new StringJoiner(", ", "[", "]");
this.logHeader(header, headers);
joiner.add("headers=" + headers.toString());
}
}
}
private void logHeader(Header header, StringJoiner joiner) {
joiner.add(header.name() + "=" + header.values());
}
protected abstract void log(String methodName, String message);
}