c# - 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。
请帮我解决这个问题 - 谢谢大家。
解决方案
也许您找到了解决方案,但这可以帮助您。安装 nuget:Serilog.Sinks.PostgreSQL和Serilog.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
推荐阅读
- angular - Outlook REST API SendMail - https://outlook.office.com/api/v2.0/me/sendmail 的 Http 失败响应:401 Unauthorized
- drm - 在 Rooted WebOS LG TV 上安装自己的应用程序
- vaadin - 对 vaadin 7.1 的屏幕阅读器支持
- javascript - 有没有办法以编程方式更改 wix 中画廊的收藏
- javascript - 删除付款方式后重新加载 Braintree Drop-In UI
- sql - 如何在单行中获取具有不同详细信息的 SQL 副本。?
- xero-api - 是否可以检索与 xero 银行交易关联的“帐户”
- java - 如何处理按 Java 版本更改的导入,并编译多个版本
- python - 关闭以无头模式运行的 Firefox 窗口
- wordpress - 多文件上传字段的重力表单预览缩略图