首页 > 解决方案 > Serilog PostgresSql 接收器中的 .NET Core 自定义列

问题描述

我在我的 .NET Core 应用程序中使用 Serilog。我已将自定义列添加到默认列列表中。

这是我的配置:

appsettings.json

"Serilog": {
    "Using": [ "Serilog.Sinks.PostgreSQL" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "D:\\Logs\\logs.txt",
          "outputTemplate": "{Timestamp} {Message}{NewLine:1}{Exception:1}"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "D:\\Logs\\logs.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
        }
      },
      {
        "Name": "PostgreSQL",
        "Args": {
          "connectionString": "my-connection",
          "tableName": "public.mylogs",
          "needAutoCreateTable": true,
          "batchPostingLimit": 1,
          "restrictedToMinimumLevel": "Information",
          "removeStandardColumns": [ "MessageTemplate" ],
          "customColumns": [
          {
            "ColumnName": "username",
            "DataType": "varchar",
            "DataLength": 50
          }
        ]
        }
      }
    ],

    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      "WithProcessId",
      "WithThreadId"
    ],
    "Properties": {
      "ApplicationName": "Shamis-Radio-Control-System"
    }
  },

Program.cs

public static IConfiguration Configuration { get; private set; }

public static void Main(string[] args)
{
    Configuration = new ConfigurationBuilder()
        //.SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", true, true)
        //.AddCommandLine(args)
        //.AddEnvironmentVariables()
        .Build();

    // Configure serilog
    Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .CreateLogger();

    try
    {
        Log.Information("Starting up...");
        CreateHostBuilder(args).Build().Run();
        Log.Information("Shutting down...");
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Api host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }

    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                //.UseConfiguration(Configuration)
                .UseSerilog();
            });

这是我的控制器:

try
{
    using (LogContext.PushProperty("username", "Waleed"))
    {
        _ILogger.LogInformation("{Message}", "Starting up...");
    }     
}
catch (Exception ex)
{
    using (LogContext.PushProperty("username", "User1"))
    {
        _ILogger.LogInformation("{Message}", "Starting up...");
    }           
}

运行项目将生成新表mylogs,但不会删除列MessageTemplate,也不会生成自定义列username

我尝试手动添加列“用户名”,但始终值为 null。

请帮我解决这个问题 - 谢谢大家。

标签: c#.netasp.net-coreserilogserilog-postgresql

解决方案


也许您找到了解决方案,但这可以帮助您。安装 nuget:Serilog.Sinks.PostgreSQLSerilog.Sinks.PostgreSQL.Configuration

添加 SelfLog 以查看任何错误(不是必需的,但可以帮助您):

Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

这是您可以调整的配置(添加或删除列,更改 ColumnWriters...):

    "Serilog": {
    "Using": [ "Serilog.Sinks.PostgreSQL.Configuration" ], // THIS IS IMPORTANT
    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      "WithEnvironmentUserName",
      "WithExceptionDetails",
      "WithDemystifiedStackTraces"
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information",
        "System": "Warning",
        "Microsoft.AspNetCore.Authentication": "Information",
        "Microsoft.EntityFrameworkCore": "Error"
      }
    },
    "WriteTo": [
      {
        "Name": "PostgreSQL",
        "Args": {
          "connectionString": "User ID='yyyyyy';Password=xxxxx;Host=localhost;Port=5432;Database=DbName;Pooling=true;",
          "tableName": "\"Logs\"",
          "needAutoCreateTable": true
        }
      }
    ]
  },
  "Columns": {
    "\"Message\"": "RenderedMessageColumnWriter",
    "\"MessageTemplate\"": "MessageTemplateColumnWriter",
    "\"Level\"": {
      "Name": "LevelColumnWriter",
      "Args": {
        "renderAsText": true,
        "dbType": "Varchar"
      }
    },
    "\"TimeStamp\"": "TimestampColumnWriter",
    "\"Exception\"": "ExceptionColumnWriter",
    "\"Properties\"": "LogEventSerializedColumnWriter",
    "\"PropsTest\"": {
      "Name": "PropertiesColumnWriter",
      "Args": {
        "dbType": "Json"
      }
    },
    "\"MachineName\"": {
      "Name": "SinglePropertyColumnWriter",
      "Args": {
        "propertyName": "MachineName",
        "writeMethod": "Raw"
      }
    }
  }

还要检查这个链接:https ://github.com/b00ted/serilog-sinks-postgresql


推荐阅读