Skip to content

feat(logging): separate fields #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@sketch7/fluently-http-client",
"version": "4.1.0",
"version": "4.2.0",
"versionSuffix": "",
"scripts": {
"pack": "bash ./tools/pack.sh",
Expand Down
96 changes: 77 additions & 19 deletions src/FluentlyHttpClient/Middleware/LoggerHttpMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ ILoggerFactory loggerFactory
public async Task<FluentHttpResponse> Invoke(FluentHttpMiddlewareContext context)
{
var request = context.Request;

if (!_logger.IsEnabled(LogLevel.Information))
return await _next(context);

Expand All @@ -68,30 +69,56 @@ public async Task<FluentHttpResponse> Invoke(FluentHttpMiddlewareContext context
&& !options.ShouldLogDetailedResponse.GetValueOrDefault(false))
{
response = await _next(context);
_logger.LoggerHttp_CondensedRequest(request.Method, request.Uri!, response.StatusCode, watch.GetElapsedTime().TotalMilliseconds);
_logger.LoggerHttp_CondensedRequest(
request.Message.Version,
request.Method,
request.Uri!,
response.StatusCode,
watch.GetElapsedTime().TotalMilliseconds
);
return response;
}

if (!(options.ShouldLogDetailedRequest ?? false))
_logger.LoggerHttp_Request(request);
_logger.LoggerHttp_Request(request.Message.Version, request.Method, request.Uri!);
else
{
string? requestContent = null;
if (request.Message.Content != null)
requestContent = await request.Message.Content.ReadAsStringAsync();
_logger.LoggerHttp_RequestDetailed(request, request.Headers.ToFormattedString(), requestContent);
_logger.LoggerHttp_RequestDetailed(
request.Message.Version,
request.Method,
request.Uri!,
request.Headers.ToFormattedString(),
requestContent
);
}

response = await _next(context);
var stopwatchElapsed = watch.GetElapsedTime();
if (response.Content == null || !(options.ShouldLogDetailedResponse ?? false))
{
_logger.LoggerHttp_Response(response, stopwatchElapsed.TotalMilliseconds);
_logger.LoggerHttp_Response(
response.Message.Version,
request.Method,
request.Uri!,
response.StatusCode,
stopwatchElapsed.TotalMilliseconds
);
return response;
}

var responseContent = await response.Content.ReadAsStringAsync();
_logger.LoggerHttp_ResponseDetailed(response, response.Headers.ToFormattedString(), responseContent, stopwatchElapsed.TotalMilliseconds);
_logger.LoggerHttp_ResponseDetailed(
response.Message.Version,
request.Method,
request.Uri!,
response.StatusCode,
response.Headers.ToFormattedString(),
responseContent,
stopwatchElapsed.TotalMilliseconds
);
return response;
}
}
Expand Down Expand Up @@ -166,18 +193,49 @@ public static FluentHttpClientBuilder UseLogging(this FluentHttpClientBuilder bu

internal static partial class LogExtensions
{
[LoggerMessage(LogLevel.Information, "HTTP request [{method}] {requestUrl} responded {statusCode:D} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_CondensedRequest(this ILogger logger, HttpMethod method, Uri requestUrl, HttpStatusCode statusCode, double elapsed);

[LoggerMessage(LogLevel.Information, "Pre - request... {request}")]
internal static partial void LoggerHttp_Request(this ILogger logger, FluentHttpRequest request);

[LoggerMessage(LogLevel.Information, "Pre-request... {request}\nHeaders: {headers}\nContent: {requestContent}")]
internal static partial void LoggerHttp_RequestDetailed(this ILogger logger, FluentHttpRequest request, string headers, string? requestContent);

[LoggerMessage(LogLevel.Information, "Post-request... {response} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_Response(this ILogger logger, FluentHttpResponse response, double elapsed);

[LoggerMessage(LogLevel.Information, "Post-request... {response}\nHeaders: {headers}\nContent: {responseContent} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_ResponseDetailed(this ILogger logger, FluentHttpResponse response, string headers, string? responseContent, double elapsed);
[LoggerMessage(LogLevel.Information, "HTTP request ({httpVersion}) [{method}] '{requestUrl}' responded {statusCode:D} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_CondensedRequest(
this ILogger logger,
Version httpVersion,
HttpMethod method,
Uri requestUrl,
HttpStatusCode statusCode,
double elapsed
);

[LoggerMessage(LogLevel.Information, "Pre - request... ({httpVersion}) [{method}] '{requestUrl}'")]
internal static partial void LoggerHttp_Request(this ILogger logger, Version httpVersion, HttpMethod method, Uri requestUrl);

[LoggerMessage(LogLevel.Information, "Pre-request... ({httpVersion}) [{method}] '{requestUrl}' \nHeaders: {headers}\nContent: {requestContent}")]
internal static partial void LoggerHttp_RequestDetailed(
this ILogger logger,
Version httpVersion,
HttpMethod method,
Uri requestUrl,
string headers,
string? requestContent
);

[LoggerMessage(LogLevel.Information, "Post-request... ({httpVersion}) [{method}] '{requestUrl}' responded {statusCode:D} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_Response(
this ILogger logger,
Version httpVersion,
HttpMethod method,
Uri requestUrl,
HttpStatusCode statusCode,
double elapsed
);

[LoggerMessage(LogLevel.Information, "Post-request... ({httpVersion}) [{method}] '{requestUrl}' responded {statusCode:D} " +
"\nHeaders: {headers}\nContent: {responseContent} in {elapsed:n0}ms")]
internal static partial void LoggerHttp_ResponseDetailed(
this ILogger logger,
Version httpVersion,
HttpMethod method,
Uri requestUrl,
HttpStatusCode statusCode,
string headers,
string? responseContent,
double elapsed
);
}
Loading