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 目录中。

将文件放在那里后,问题就解决了。感谢所有帮助过的人!