in src/Middleware/Http/Common/Logging.cs [62:178]
public static void LogRequest(LogRequestParams parameters)
{
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
string method = string.Empty;
string service = string.Empty;
string requestUri = string.Empty;
string component = string.Empty;
switch (parameters.Request)
{
case HttpRequestMessage httpRequest:
method = httpRequest.Method.Method;
service = httpRequest.RequestUri?.Host ?? "unknown";
requestUri = httpRequest.RequestUri?.ToString() ?? "unknown";
component = "client";
break;
case Request azcoreRequest:
method = azcoreRequest.Method.Method;
service = azcoreRequest.Uri.Host?? "unknown";
requestUri = azcoreRequest.Uri.ToString()?? "unknown";
component = "client";
break;
case HttpRequest httpRequest:
method = httpRequest.Method;
service = httpRequest.Host.ToString();
requestUri = $"{httpRequest.Scheme}://{service}{httpRequest.Path}{httpRequest.QueryString}";
component = "server";
break;
default:
return; // Unknown request type, do nothing
}
Uri parsedUri;
try
{
parsedUri = new Uri(requestUri);
}
catch (UriFormatException ex)
{
parameters.Logger.ForContext("source", "ApiRequestLog")
.ForContext("protocol", "REST")
.ForContext("method_type", "unary")
.ForContext("code", "na")
.ForContext("component", component)
.ForContext("time_ms", "na")
.ForContext("method", method)
.ForContext("service", service)
.ForContext("url", requestUri)
.ForContext("error", ex.Message)
.Error("Error parsing request URL");
return;
}
string trimmedUri = TrimUrl(parsedUri);
string methodInfo = GetMethodInfo(method, trimmedUri);
double latency = (DateTime.UtcNow - parameters.StartTime).TotalMilliseconds;
var logEntry = parameters.Logger.ForContext("source", "ApiRequestLog")
.ForContext("protocol", "REST")
.ForContext("method_type", "unary")
.ForContext("component", component)
.ForContext("time_ms", latency)
.ForContext("method", methodInfo)
.ForContext("service", service)
.ForContext("url", trimmedUri);
if (parameters.Error != null || parameters.Response == null)
{
logEntry.ForContext("error", parameters.Error?.Message ?? "unknown error")
.ForContext("code", "na")
.Error("Finished call");
}
else
{
int statusCode;
string? reasonPhrase;
if (parameters.Response is HttpResponseMessage httpResponse)
{
statusCode = (int)httpResponse.StatusCode;
reasonPhrase = httpResponse.ReasonPhrase?? "unknown";
}
else if (parameters.Response is Azure.Response azureResponse)
{
statusCode = azureResponse.Status;
reasonPhrase = azureResponse.ReasonPhrase;
}
else if (parameters.Response is HttpResponse restHttpResponse)
{
statusCode = restHttpResponse.StatusCode;
reasonPhrase = null; // ReasonPhrase is not available in HttpResponse
}
else
{
statusCode = 0;
reasonPhrase = "unknown";
}
if (statusCode >= 200 && statusCode < 300)
{
logEntry.ForContext("error", "na")
.ForContext("code", statusCode)
.Information("finished call");
}
else
{
logEntry.ForContext("error", reasonPhrase ?? "Unknown error")
.ForContext("code", statusCode)
.Error("finished call");
}
}
}