Serilog SQL 接收器日志服务器名称和 ASPNETCORE_ENVIRONMENT 作为列
Serilog SQL Sink Log Server Name and ASPNETCORE_ENVIRONMENT as columns
我的应用程序 运行 在负载平衡的 Web 服务器环境中。此外,在较低的环境中,用于日志记录的 SQL 数据库在多个环境之间共享。除了默认列之外,我想将服务器名称和环境名称记录为两个单独的列。如何在 startup.cs 中配置 SQL 服务器接收器?
这些列不是接收器支持的 the standard columns 的一部分。
下面是当前架构,有两个额外的列...
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Logs]') AND type in (N'U'))
BEGIN
DROP TABLE [dbo].[Logs]
END
CREATE TABLE [dbo].[Logs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Environment] [nvarchar](60) NULL,
[ServerName] [nvarchar](60) 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,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
从文档来看,我似乎需要按以下方式配置列...(出于某种原因,他们的文档似乎与 Serilog.Sinks.MSSqlServer 版本 5.1.2 不同步)
这是我认为我需要使用的东西
var sqlLogTableColumnOptions = new ColumnOptions
{
AdditionalDataColumns = new Collection<DataColumn>
{
new DataColumn{ ColumnName = "Environment", DataType = typeof(string), MaxLength= 60},
new DataColumn{ ColumnName = "ServerName", DataType = typeof(string), MaxLength = 60}
}
};
在log4net中,我以前是这样设置的:
private string serverName = System.Net.Dns.GetHostName();
...
log4net.ThreadContext.Properties["Server"] = serverName;
结果证明解决方案非常简单,我有点恍然大悟。我不确定我是否应该为此使用 nuget package 但它只需要 2 行代码就可以让它工作:
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("ServerName", Environment.MachineName or System.Net.Dns.GetHostName()) // whatever you need to log
.Enrich.WithProperty("Environment", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production")
... // rest of the code in Startup.cs
我的应用程序 运行 在负载平衡的 Web 服务器环境中。此外,在较低的环境中,用于日志记录的 SQL 数据库在多个环境之间共享。除了默认列之外,我想将服务器名称和环境名称记录为两个单独的列。如何在 startup.cs 中配置 SQL 服务器接收器?
这些列不是接收器支持的 the standard columns 的一部分。
下面是当前架构,有两个额外的列...
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Logs]') AND type in (N'U'))
BEGIN
DROP TABLE [dbo].[Logs]
END
CREATE TABLE [dbo].[Logs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Environment] [nvarchar](60) NULL,
[ServerName] [nvarchar](60) 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,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
从文档来看,我似乎需要按以下方式配置列...(出于某种原因,他们的文档似乎与 Serilog.Sinks.MSSqlServer 版本 5.1.2 不同步)
这是我认为我需要使用的东西
var sqlLogTableColumnOptions = new ColumnOptions
{
AdditionalDataColumns = new Collection<DataColumn>
{
new DataColumn{ ColumnName = "Environment", DataType = typeof(string), MaxLength= 60},
new DataColumn{ ColumnName = "ServerName", DataType = typeof(string), MaxLength = 60}
}
};
在log4net中,我以前是这样设置的:
private string serverName = System.Net.Dns.GetHostName();
...
log4net.ThreadContext.Properties["Server"] = serverName;
结果证明解决方案非常简单,我有点恍然大悟。我不确定我是否应该为此使用 nuget package 但它只需要 2 行代码就可以让它工作:
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("ServerName", Environment.MachineName or System.Net.Dns.GetHostName()) // whatever you need to log
.Enrich.WithProperty("Environment", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production")
... // rest of the code in Startup.cs