AspNet Core Serilog SQL 自定义列不起作用

AspNet Core Serilog SQL custom column not working

我在我的 ASP.NET 核心 MVC Web 应用程序中使用 dotnet 3.1 设置了 SeriLog,并添加了几个额外的列。尝试自动填充用户名是行不通的。其他一切正常。 我正在使用 Microsoft.Extensions.Logging ILogger 将我的记录器注入控制器。 不能使用 LogContext 自动设置此 属性,还是我必须像这样为每个日志条目显式调用对象,(“{UserName} 记录的信息”,User.Identity.Name)。

这是我的 Program.cs

public static void Main(string[] args)
    {
        // Boilerplate code: https://github.com/serilog/serilog-aspnetcore/blob/dev/samples/Sample/Program.cs
        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateBootstrapLogger();

        Log.Information("Starting up!");

        try
        {
            CreateHostBuilder(args).Build().Run();
            Log.Information("Stopped cleanly");
        }
        catch (System.Exception ex)
        {
            Log.Fatal(ex, "An unhandled exception occured during bootstrapping");
            throw;
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
                    .UseSerilog((context, services, configuration) => configuration
                        .ReadFrom.Configuration(context.Configuration)
                        .ReadFrom.Services(services)
                        .Enrich.FromLogContext()
                        .WriteTo.Console()
                        .WriteTo.MSSqlServer(
                            context.Configuration.GetConnectionString("FlightDelayDatabase"), 
                            sinkOptions: new MSSqlServerSinkOptions { TableName = "Log" }, null, null, 
                            LogEventLevel.Information, null, columnOptions: new ColumnOptions
                            {
                                AdditionalColumns = new Collection<SqlColumn>
                                {
                                   new SqlColumn("UserName", SqlDbType.NVarChar)
                                }
                            }, null, null))
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
    }

在我的 StartUp.cs 中,我在 app.UseAuthorization() 和 app.UseEndpoints()

之间
app.Use(async (context, next) =>
        {
            var userName = context.User.Identity.IsAuthenticated ? context.User.Identity.Name : "Guest"; //Gets user Name from user Identity  
            LogContext.PushProperty("Username", userName); //Push user in LogContext;  
            await next(); 
        });

使用 Serilog.AspNetCore 4.1.0 和 Serilog.Sinks.MSSqlServer 5.6.1.

这是架构

CREATE TABLE [dbo].[Log](  
[Id] [int] IDENTITY(1,1) NOT NULL,  
[Message] [nvarchar](max) NULL,  
[MessageTemplate] [nvarchar](max) NULL,  
[Level] [nvarchar](128) NULL,  
[TimeStamp] [datetimeoffset](7) NOT NULL,  
[Exception] [nvarchar](max) NULL,  
[Properties] [xml] NULL,  
[LogEvent] [nvarchar](max) NULL,  
[UserName] [nvarchar](200) NULL,  
[IP] [varchar](200) NULL,  

...

从数据库中,这里有一个来自属性 xml 列的日志条目。

您可以像下面这样使用 UseSerilogRequestLogging 添加用户名和 IP 地址等自定义属性。您应该在 UseAuthentication 之后添加它以登录用户名。

app.UseAuthentication();

app.UseSerilogRequestLogging(options =>
{
    // Attach additional properties to the request completion event
    options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
    {
        diagnosticContext.Set("UserName", httpContext.User.Identity.Name);
        diagnosticContext.Set("IP", httpContext.Connection.RemoteIpAddress.ToString());
    };
});

app.UseAuthorization();

还将 Enrich.FormLogContext() 添加到 LoggerConfiguration

Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext() // <-- Add Enrich.FormLogContent()
            .WriteTo.Console()
            .CreateLogger();

您可以在此处找到更多详细信息https://github.com/serilog/serilog-aspnetcore