Serilog sql 服务器接收器不写入消息
Serilog sql server sink not writing messages
-=-=-=-=最新更新
在我的 catch 块中,我在 Quick Watch 中调出异常变量,向下钻取内部异常显示了这个错误:
Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
问题是,在我的 bin\debug 目录中,那个文件就在那里!!!那为什么找不到呢?我试过了,但无法直接引用它。
-=-=-=更新
下面的建议答案有一些链接,我重新检查了这些链接。我选择了有用的代码,例如将我的日志对象分配给静态记录器,然后调用 CloseAndFlush。
在执行 CloseAndFlush 调用时向我显示 Microsoft.Data.SqlClient.dll 错误。我使用 NuGet 更新 SQLClient,但仍然出现这些错误:
Exception thrown: 'System.DllNotFoundException' in Microsoft.Data.SqlClient.dll
Exception thrown: 'System.TypeInitializationException' in Microsoft.Data.SqlClient.dll
我现在正在调查那些 SQL.Client 错误。
-=-=-=-=-=-=
使用 Asp.NET,不是核心。试图让基本的 sql 服务器接收器工作,但没有成功。一定是很简单的问题,但是我看不出来。
下面是要写入的 table,它已经存在。使用 seriuser 帐户,我可以通过 SSMS 连接,并执行所有 CRUD 操作。我还编写了一个使用连接到数据库的 SQL 数据对象的方法,我也可以通过这种方式对其执行所有 CRUD 操作。但是对于 Serilog,日志语句不记录任何内容。我可能会错过什么?数据库在我的机器上是本地的。断点显示有效的记录器对象。也通过在 sinkoptions 中传入 schemaname 进行了尝试,但没有成功。没有错误,之前有一个围绕记录器代码的 try catch 块。
带有控制台应用程序和 class 库的解决方案。没有比这更简单的了。
控制台应用程序在 program.cs 中有这个:
class Program
{
static void Main(string[] args)
{
SLogger logger = new SLogger();
}
}
class 文件和 sql table:
public class SLogger
{
public SLogger()
{
var columnOption = new ColumnOptions();
columnOption.Store.Remove(StandardColumn.MessageTemplate);
ILogger log = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.MSSqlServer(@"Data Source=LW39\QA;Initial Catalog=DEV;user id=seriuser;Password=SERIUSER1;",
sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" },
columnOptions: columnOption)
.CreateLogger();
log.Information("Logger created.");
.....
.....
CREATE TABLE [dbo].[Logs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Message] [nvarchar](max) NULL,
[MessageTemplate] [nvarchar](max) NULL,
[Level] [nvarchar](128) NULL,
[TimeStamp] [datetime] NOT NULL,
[Exception] [nvarchar](max) NULL,
[Properties] [nvarchar](max) NULL,
CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
这是一个很常见的问题。 SO 上有很多答案:
- Serilog ms sql sink not writing to my table
我在上次更新中提到我收到了这个错误,我认为这是我问题的根本原因:
Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
我的困惑是因为所述文件位于 class 库目录中。
正如我还提到的,我的解决方案中有两个项目:class 库和测试控制台应用程序。原来 dll 需要在 console 应用程序的 bin 目录中!!特别是在我必须创建的 x86 目录中。
将文件放在那里后,问题就解决了。感谢所有帮助过的人!
-=-=-=-=最新更新
在我的 catch 块中,我在 Quick Watch 中调出异常变量,向下钻取内部异常显示了这个错误:
Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
问题是,在我的 bin\debug 目录中,那个文件就在那里!!!那为什么找不到呢?我试过了,但无法直接引用它。
-=-=-=更新
下面的建议答案有一些链接,我重新检查了这些链接。我选择了有用的代码,例如将我的日志对象分配给静态记录器,然后调用 CloseAndFlush。
在执行 CloseAndFlush 调用时向我显示 Microsoft.Data.SqlClient.dll 错误。我使用 NuGet 更新 SQLClient,但仍然出现这些错误:
Exception thrown: 'System.DllNotFoundException' in Microsoft.Data.SqlClient.dll
Exception thrown: 'System.TypeInitializationException' in Microsoft.Data.SqlClient.dll
我现在正在调查那些 SQL.Client 错误。
-=-=-=-=-=-=
使用 Asp.NET,不是核心。试图让基本的 sql 服务器接收器工作,但没有成功。一定是很简单的问题,但是我看不出来。
下面是要写入的 table,它已经存在。使用 seriuser 帐户,我可以通过 SSMS 连接,并执行所有 CRUD 操作。我还编写了一个使用连接到数据库的 SQL 数据对象的方法,我也可以通过这种方式对其执行所有 CRUD 操作。但是对于 Serilog,日志语句不记录任何内容。我可能会错过什么?数据库在我的机器上是本地的。断点显示有效的记录器对象。也通过在 sinkoptions 中传入 schemaname 进行了尝试,但没有成功。没有错误,之前有一个围绕记录器代码的 try catch 块。
带有控制台应用程序和 class 库的解决方案。没有比这更简单的了。
控制台应用程序在 program.cs 中有这个:
class Program
{
static void Main(string[] args)
{
SLogger logger = new SLogger();
}
}
class 文件和 sql table:
public class SLogger
{
public SLogger()
{
var columnOption = new ColumnOptions();
columnOption.Store.Remove(StandardColumn.MessageTemplate);
ILogger log = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.MSSqlServer(@"Data Source=LW39\QA;Initial Catalog=DEV;user id=seriuser;Password=SERIUSER1;",
sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" },
columnOptions: columnOption)
.CreateLogger();
log.Information("Logger created.");
.....
.....
CREATE TABLE [dbo].[Logs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Message] [nvarchar](max) NULL,
[MessageTemplate] [nvarchar](max) NULL,
[Level] [nvarchar](128) NULL,
[TimeStamp] [datetime] NOT NULL,
[Exception] [nvarchar](max) NULL,
[Properties] [nvarchar](max) NULL,
CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
这是一个很常见的问题。 SO 上有很多答案:
- Serilog ms sql sink not writing to my table
我在上次更新中提到我收到了这个错误,我认为这是我问题的根本原因:
Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
我的困惑是因为所述文件位于 class 库目录中。
正如我还提到的,我的解决方案中有两个项目:class 库和测试控制台应用程序。原来 dll 需要在 console 应用程序的 bin 目录中!!特别是在我必须创建的 x86 目录中。
将文件放在那里后,问题就解决了。感谢所有帮助过的人!