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
Changes from 4 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
76 changes: 57 additions & 19 deletions src/FluentlyHttpClient/Middleware/LoggerHttpMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ ILoggerFactory loggerFactory
public async Task<FluentHttpResponse> Invoke(FluentHttpMiddlewareContext context)
{
var request = context.Request;
var path = request.Uri!.AbsolutePath;
var httpVersion = request.Message.Version;

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

Expand All @@ -68,30 +71,30 @@ 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.Method, request.Uri!, path, response.StatusCode, watch.GetElapsedTime().TotalMilliseconds, httpVersion);
return response;
}

if (!(options.ShouldLogDetailedRequest ?? false))
_logger.LoggerHttp_Request(request);
_logger.LoggerHttp_Request(request.Method, request.Uri!, path, httpVersion);
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.Method, request.Uri!, path, request.Headers.ToFormattedString(), requestContent, httpVersion);
}

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

var responseContent = await response.Content.ReadAsStringAsync();
_logger.LoggerHttp_ResponseDetailed(response, response.Headers.ToFormattedString(), responseContent, stopwatchElapsed.TotalMilliseconds);
_logger.LoggerHttp_ResponseDetailed(request.Method, request.Uri!, path, response.StatusCode, response.Headers.ToFormattedString(), responseContent, stopwatchElapsed.TotalMilliseconds, httpVersion);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

httpVersion theres one in the request and one in the response - for this one we can log the response one

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

return response;
}
}
Expand Down Expand Up @@ -166,18 +169,53 @@ 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 [{method}] '{requestUrl}' ({path}) responded {statusCode:D} in {elapsed:n0}ms ({httpVersion})")]
Copy link
Member

@stephenlautier stephenlautier Oct 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Would move the version infront, and part of the request
Suggested change
[LoggerMessage(LogLevel.Information, "HTTP request [{method}] '{requestUrl}' ({path}) responded {statusCode:D} in {elapsed:n0}ms ({httpVersion})")]
[LoggerMessage(LogLevel.Information, "HTTP request ({httpVersion}) [{method}] '{requestUrl}' ({path}) responded {statusCode:D} in {elapsed:n0}ms")]
  • path I think I would remove

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

internal static partial void LoggerHttp_CondensedRequest(
this ILogger logger,
HttpMethod method,
Uri requestUrl,
string path,
HttpStatusCode statusCode,
double elapsed,
Version httpVersion
);

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

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

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

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