43 lines
1.7 KiB
C#
43 lines
1.7 KiB
C#
using System.Security.Claims;
|
|
using Serilog;
|
|
using Serilog.AspNetCore;
|
|
using Serilog.Events;
|
|
using Tiku.Application.Security;
|
|
|
|
namespace Tiku.Api.Logging;
|
|
|
|
public static class SerilogRequestLogging
|
|
{
|
|
public static void ConfigureRequestLogging(RequestLoggingOptions options)
|
|
{
|
|
options.GetLevel = (httpContext, elapsed, exception) =>
|
|
exception is not null || httpContext.Response.StatusCode >= StatusCodes.Status500InternalServerError
|
|
? LogEventLevel.Error
|
|
: elapsed > 1000 || httpContext.Response.StatusCode >= StatusCodes.Status400BadRequest
|
|
? LogEventLevel.Warning
|
|
: LogEventLevel.Information;
|
|
|
|
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
|
|
{
|
|
diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
|
|
diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
|
|
diagnosticContext.Set("TraceId", httpContext.TraceIdentifier);
|
|
|
|
var user = httpContext.User;
|
|
SetClaim(diagnosticContext, "UserId", user, TikuClaimTypes.UserId);
|
|
SetClaim(diagnosticContext, "TenantId", user, TikuClaimTypes.TenantId);
|
|
SetClaim(diagnosticContext, "SessionId", user, TikuClaimTypes.SessionId);
|
|
SetClaim(diagnosticContext, "AuthRealm", user, TikuClaimTypes.Realm);
|
|
};
|
|
}
|
|
|
|
private static void SetClaim(
|
|
IDiagnosticContext diagnosticContext,
|
|
string propertyName,
|
|
ClaimsPrincipal principal,
|
|
string claimType)
|
|
{
|
|
var value = principal.FindFirst(claimType)?.Value;
|
|
if (!string.IsNullOrWhiteSpace(value)) diagnosticContext.Set(propertyName, value);
|
|
}
|
|
} |