1717
1818import java .io .BufferedReader ;
1919import java .io .IOException ;
20+ import java .io .PrintWriter ;
2021import java .io .Reader ;
22+ import java .io .StringWriter ;
2123import java .util .logging .FileHandler ;
2224import java .util .logging .LogRecord ;
2325import java .util .logging .SimpleFormatter ;
@@ -59,8 +61,8 @@ public enum Level {
5961 public static class ErrorLogger extends Logger {
6062 final java .util .logging .Logger logger = java .util .logging .Logger .getLogger (Logger .class .getName ());
6163
62- @ Override protected void log (Target <?> target , String format , Object ... args ) {
63- System .err .printf (format + "%n" , args );
64+ @ Override protected void log (String configKey , String format , Object ... args ) {
65+ System .err .printf (methodTag ( configKey ) + format + "%n" , args );
6466 }
6567 }
6668
@@ -70,22 +72,22 @@ public static class ErrorLogger extends Logger {
7072 public static class JavaLogger extends Logger {
7173 final java .util .logging .Logger logger = java .util .logging .Logger .getLogger (Logger .class .getName ());
7274
73- @ Override void logRequest (Target <?> target , Level logLevel , Request request ) {
75+ @ Override void logRequest (String configKey , Level logLevel , Request request ) {
7476 if (logger .isLoggable (java .util .logging .Level .FINE )) {
75- super .logRequest (target , logLevel , request );
77+ super .logRequest (configKey , logLevel , request );
7678 }
7779 }
7880
7981 @ Override
80- Response logAndRebufferResponse (Target <?> target , Level logLevel , Response response , long elapsedTime ) throws IOException {
82+ Response logAndRebufferResponse (String configKey , Level logLevel , Response response , long elapsedTime ) throws IOException {
8183 if (logger .isLoggable (java .util .logging .Level .FINE )) {
82- return super .logAndRebufferResponse (target , logLevel , response , elapsedTime );
84+ return super .logAndRebufferResponse (configKey , logLevel , response , elapsedTime );
8385 }
8486 return response ;
8587 }
8688
87- @ Override protected void log (Target <?> target , String format , Object ... args ) {
88- logger .fine (String .format (format , args ));
89+ @ Override protected void log (String configKey , String format , Object ... args ) {
90+ logger .fine (String .format (methodTag ( configKey ) + format , args ));
8991 }
9092
9193 /**
@@ -110,64 +112,68 @@ public String format(LogRecord record) {
110112 }
111113
112114 public static class NoOpLogger extends Logger {
113- @ Override void logRequest (Target <?> target , Level logLevel , Request request ) {
115+ @ Override void logRequest (String configKey , Level logLevel , Request request ) {
114116 }
115117
116118 @ Override
117- Response logAndRebufferResponse (Target <?> target , Level logLevel , Response response , long elapsedTime ) throws IOException {
119+ Response logAndRebufferResponse (String configKey , Level logLevel , Response response , long elapsedTime ) throws IOException {
118120 return response ;
119121 }
120122
121123 @ Override
122- protected void log (Target <?> target , String format , Object ... args ) {
124+ protected void log (String configKey , String format , Object ... args ) {
123125 }
124126 }
125127
126128 /**
127129 * Override to log requests and responses using your own implementation.
128130 * Messages will be http request and response text.
129131 *
130- * @param target useful if using MDC (Mapped Diagnostic Context) loggers
131- * @param format {@link java.util.Formatter format string}
132- * @param args arguments applied to {@code format}
132+ * @param configKey value of {@link Feign#configKey(java.lang.reflect.Method)}
133+ * @param format {@link java.util.Formatter format string}
134+ * @param args arguments applied to {@code format}
133135 */
134- protected abstract void log (Target <?> target , String format , Object ... args );
136+ protected abstract void log (String configKey , String format , Object ... args );
135137
136- void logRequest (Target <?> target , Level logLevel , Request request ) {
137- log (target , "---> %s %s HTTP/1.1" , request .method (), request .url ());
138+ void logRequest (String configKey , Level logLevel , Request request ) {
139+ log (configKey , "---> %s %s HTTP/1.1" , request .method (), request .url ());
138140 if (logLevel .ordinal () >= Level .HEADERS .ordinal ()) {
139141
140142 for (String field : request .headers ().keySet ()) {
141143 for (String value : valuesOrEmpty (request .headers (), field )) {
142- log (target , "%s: %s" , field , value );
144+ log (configKey , "%s: %s" , field , value );
143145 }
144146 }
145147
146148 int bytes = 0 ;
147149 if (request .body () != null ) {
148150 bytes = request .body ().getBytes (UTF_8 ).length ;
149151 if (logLevel .ordinal () >= Level .FULL .ordinal ()) {
150- log (target , "" ); // CRLF
151- log (target , "%s" , request .body ());
152+ log (configKey , "" ); // CRLF
153+ log (configKey , "%s" , request .body ());
152154 }
153155 }
154- log (target , "---> END HTTP (%s-byte body)" , bytes );
156+ log (configKey , "---> END HTTP (%s-byte body)" , bytes );
155157 }
156158 }
157159
158- Response logAndRebufferResponse (Target <?> target , Level logLevel , Response response , long elapsedTime ) throws IOException {
159- log (target , "<--- HTTP/1.1 %s %s (%sms)" , response .status (), response .reason (), elapsedTime );
160+ void logRetry (String configKey , Level logLevel ) {
161+ log (configKey , "---> RETRYING" );
162+ }
163+
164+ Response logAndRebufferResponse (String configKey , Level logLevel , Response response , long elapsedTime ) throws IOException {
165+ log (configKey , "<--- HTTP/1.1 %s %s (%sms)" , response .status (), response .reason (), elapsedTime );
160166 if (logLevel .ordinal () >= Level .HEADERS .ordinal ()) {
161167
162168 for (String field : response .headers ().keySet ()) {
163169 for (String value : valuesOrEmpty (response .headers (), field )) {
164- log (target , "%s: %s" , field , value );
170+ log (configKey , "%s: %s" , field , value );
165171 }
166172 }
167173
168174 if (response .body () != null ) {
169175 if (logLevel .ordinal () >= Level .FULL .ordinal ()) {
170- log (target , "" ); // CRLF
176+ log (configKey , "" ); // CRLF
171177 }
172178
173179 Reader body = response .body ().asReader ();
@@ -178,11 +184,11 @@ Response logAndRebufferResponse(Target<?> target, Level logLevel, Response respo
178184 while ((line = reader .readLine ()) != null ) {
179185 buffered .append (line );
180186 if (logLevel .ordinal () >= Level .FULL .ordinal ()) {
181- log (target , "%s" , line );
187+ log (configKey , "%s" , line );
182188 }
183189 }
184190 String bodyAsString = buffered .toString ();
185- log (target , "<--- END HTTP (%s-byte body)" , bodyAsString .getBytes (UTF_8 ).length );
191+ log (configKey , "<--- END HTTP (%s-byte body)" , bodyAsString .getBytes (UTF_8 ).length );
186192 return Response .create (response .status (), response .reason (), response .headers (), bodyAsString );
187193 } finally {
188194 ensureClosed (response .body ());
@@ -191,4 +197,19 @@ Response logAndRebufferResponse(Target<?> target, Level logLevel, Response respo
191197 }
192198 return response ;
193199 }
200+
201+ IOException logIOException (String configKey , Level logLevel , IOException ioe , long elapsedTime ) {
202+ log (configKey , "<--- ERROR %s: %s (%sms)" , ioe .getClass ().getSimpleName (), ioe .getMessage (), elapsedTime );
203+ if (logLevel .ordinal () >= Level .FULL .ordinal ()) {
204+ StringWriter sw = new StringWriter ();
205+ ioe .printStackTrace (new PrintWriter (sw ));
206+ log (configKey , sw .toString ());
207+ log (configKey , "<--- END ERROR" );
208+ }
209+ return ioe ;
210+ }
211+
212+ static String methodTag (String configKey ) {
213+ return new StringBuilder ().append ('[' ).append (configKey .substring (0 , configKey .indexOf ('(' ))).append ("] " ).toString ();
214+ }
194215}
0 commit comments