mirror of
https://github.com/bitwarden/server.git
synced 2024-11-24 12:35:25 +01:00
[PM-13098] Use ILogger.BeginScope
For Better Scopes (#4740)
* Use `ILogger.BeginScope` For Better Scopes * Format * Remove Behind Feature Flag
This commit is contained in:
parent
f3f81deb98
commit
b196c8bfb9
@ -143,6 +143,7 @@ public static class FeatureFlagKeys
|
|||||||
public const string StorageReseedRefactor = "storage-reseed-refactor";
|
public const string StorageReseedRefactor = "storage-reseed-refactor";
|
||||||
public const string TrialPayment = "PM-8163-trial-payment";
|
public const string TrialPayment = "PM-8163-trial-payment";
|
||||||
public const string Pm3478RefactorOrganizationUserApi = "pm-3478-refactor-organizationuser-api";
|
public const string Pm3478RefactorOrganizationUserApi = "pm-3478-refactor-organizationuser-api";
|
||||||
|
public const string RemoveServerVersionHeader = "remove-server-version-header";
|
||||||
|
|
||||||
public static List<string> GetAllKeys()
|
public static List<string> GetAllKeys()
|
||||||
{
|
{
|
||||||
|
117
src/SharedWeb/Utilities/RequestLoggingMiddleware.cs
Normal file
117
src/SharedWeb/Utilities/RequestLoggingMiddleware.cs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using Bit.Core;
|
||||||
|
using Bit.Core.Services;
|
||||||
|
using Bit.Core.Settings;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
namespace Bit.SharedWeb.Utilities;
|
||||||
|
|
||||||
|
public sealed class RequestLoggingMiddleware
|
||||||
|
{
|
||||||
|
private readonly RequestDelegate _next;
|
||||||
|
private readonly ILogger<RequestLoggingMiddleware> _logger;
|
||||||
|
private readonly GlobalSettings _globalSettings;
|
||||||
|
|
||||||
|
public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger, GlobalSettings globalSettings)
|
||||||
|
{
|
||||||
|
_next = next;
|
||||||
|
_logger = logger;
|
||||||
|
_globalSettings = globalSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task Invoke(HttpContext context, IFeatureService featureService)
|
||||||
|
{
|
||||||
|
if (!featureService.IsEnabled(FeatureFlagKeys.RemoveServerVersionHeader))
|
||||||
|
{
|
||||||
|
context.Response.OnStarting(() =>
|
||||||
|
{
|
||||||
|
context.Response.Headers.Append("Server-Version", AssemblyHelpers.GetVersion());
|
||||||
|
return Task.CompletedTask;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
using (_logger.BeginScope(
|
||||||
|
new RequestLogScope(context.GetIpAddress(_globalSettings),
|
||||||
|
GetHeaderValue(context, "user-agent"),
|
||||||
|
GetHeaderValue(context, "device-type"),
|
||||||
|
GetHeaderValue(context, "device-type"))))
|
||||||
|
{
|
||||||
|
return _next(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static string? GetHeaderValue(HttpContext httpContext, string header)
|
||||||
|
{
|
||||||
|
if (httpContext.Request.Headers.TryGetValue(header, out var value))
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private sealed class RequestLogScope : IReadOnlyList<KeyValuePair<string, object?>>
|
||||||
|
{
|
||||||
|
private string? _cachedToString;
|
||||||
|
|
||||||
|
public RequestLogScope(string? ipAddress, string? userAgent, string? deviceType, string? origin)
|
||||||
|
{
|
||||||
|
IpAddress = ipAddress;
|
||||||
|
UserAgent = userAgent;
|
||||||
|
DeviceType = deviceType;
|
||||||
|
Origin = origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyValuePair<string, object?> this[int index]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (index == 0)
|
||||||
|
{
|
||||||
|
return new KeyValuePair<string, object?>(nameof(IpAddress), IpAddress);
|
||||||
|
}
|
||||||
|
else if (index == 1)
|
||||||
|
{
|
||||||
|
return new KeyValuePair<string, object?>(nameof(UserAgent), UserAgent);
|
||||||
|
}
|
||||||
|
else if (index == 2)
|
||||||
|
{
|
||||||
|
return new KeyValuePair<string, object?>(nameof(DeviceType), DeviceType);
|
||||||
|
}
|
||||||
|
else if (index == 3)
|
||||||
|
{
|
||||||
|
return new KeyValuePair<string, object?>(nameof(Origin), Origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(index));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count => 4;
|
||||||
|
|
||||||
|
public string? IpAddress { get; }
|
||||||
|
public string? UserAgent { get; }
|
||||||
|
public string? DeviceType { get; }
|
||||||
|
public string? Origin { get; }
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<string, object?>> GetEnumerator()
|
||||||
|
{
|
||||||
|
for (var i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
yield return this[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
_cachedToString ??= $"IpAddress:{IpAddress} UserAgent:{UserAgent} DeviceType:{DeviceType} Origin:{Origin}";
|
||||||
|
return _cachedToString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -48,7 +48,6 @@ using Microsoft.AspNetCore.Authorization;
|
|||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
using Microsoft.AspNetCore.DataProtection;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.HttpOverrides;
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.AspNetCore.Mvc.Localization;
|
using Microsoft.AspNetCore.Mvc.Localization;
|
||||||
@ -60,7 +59,6 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Serilog.Context;
|
|
||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
using NoopRepos = Bit.Core.Repositories.Noop;
|
using NoopRepos = Bit.Core.Repositories.Noop;
|
||||||
using Role = Bit.Core.Entities.Role;
|
using Role = Bit.Core.Entities.Role;
|
||||||
@ -540,31 +538,7 @@ public static class ServiceCollectionExtensions
|
|||||||
public static void UseDefaultMiddleware(this IApplicationBuilder app,
|
public static void UseDefaultMiddleware(this IApplicationBuilder app,
|
||||||
IWebHostEnvironment env, GlobalSettings globalSettings)
|
IWebHostEnvironment env, GlobalSettings globalSettings)
|
||||||
{
|
{
|
||||||
string GetHeaderValue(HttpContext httpContext, string header)
|
app.UseMiddleware<RequestLoggingMiddleware>();
|
||||||
{
|
|
||||||
if (httpContext.Request.Headers.ContainsKey(header))
|
|
||||||
{
|
|
||||||
return httpContext.Request.Headers[header];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add version information to response headers
|
|
||||||
app.Use(async (httpContext, next) =>
|
|
||||||
{
|
|
||||||
using (LogContext.PushProperty("IPAddress", httpContext.GetIpAddress(globalSettings)))
|
|
||||||
using (LogContext.PushProperty("UserAgent", GetHeaderValue(httpContext, "user-agent")))
|
|
||||||
using (LogContext.PushProperty("DeviceType", GetHeaderValue(httpContext, "device-type")))
|
|
||||||
using (LogContext.PushProperty("Origin", GetHeaderValue(httpContext, "origin")))
|
|
||||||
{
|
|
||||||
httpContext.Response.OnStarting((state) =>
|
|
||||||
{
|
|
||||||
httpContext.Response.Headers.Append("Server-Version", AssemblyHelpers.GetVersion());
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}, null);
|
|
||||||
await next.Invoke();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UseForwardedHeaders(this IApplicationBuilder app, IGlobalSettings globalSettings)
|
public static void UseForwardedHeaders(this IApplicationBuilder app, IGlobalSettings globalSettings)
|
||||||
|
Loading…
Reference in New Issue
Block a user