【问题标题】:Serilog sql server sink not writing messagesSerilog sql server sink 不写消息
【发布时间】:2021-05-12 19:23:21
【问题描述】:

-=-=-=-=最新更新

在我的 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 server sink 工作,但没有运气。一定是很简单的问题,但我看不到。

下面是要写入的表,它已经存在。使用 seriuser 帐户,我可以通过 SSMS 连接,并执行所有 CRUD 操作。我还编写了一个使用连接到数据库的 SQL 数据对象的方法,我也可以通过这种方式对其执行所有 CRUD 操作。但是使用 Serilog,日志语句不会记录任何内容。我会错过什么?数据库在我的机器上是本地的。断点显示一个有效的记录器对象。也通过在 sinkoptions 中传递 schemaname 来尝试它,但没有运气。并且没有错误,之前在记录器代码周围有一个 try catch 块。

带有控制台应用程序和类库的解决方案。没有比这更简单的了。

控制台应用程序在 program.cs 中有这个:

    class Program
    {
        static void Main(string[] args)
        {
            SLogger logger = new SLogger();        
        }
    }

class文件和sql表:

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

【问题讨论】:

标签: serilog


【解决方案1】:

在我上次更新中提到我收到此错误,我认为这是我的问题的根本原因:

Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

我很困惑,因为所说的文件在类库目录中。

正如我还提到的,我的解决方案中有两个项目:类库和测试控制台应用程序。原来 dll 需要在 console 应用程序的 bin 目录中!!特别是在我必须创建的 x86 目录中。

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

【讨论】:

    【解决方案2】:

    这是一个很常见的问题。 SO上有很多答案:

    【讨论】:

    • 如果您认为此问题与其中一个问题重复,您可以投票结束或对问题发表评论。您的答案不应完全包含指向其他问题的链接。
    • @mason 是的,在我回答之前,我确实投票决定关闭为重复的第一件事。答案是帮助不熟悉 SO 的 OP 发现。
    • 我之前确实遇到过这些链接,并再次查看它们并尝试挑选有用的代码,例如将我的日志对象分配给静态记录器,然后调用 CloseAndFlush。执行 CloseAndFlush 调用时,这向我显示了 Microsoft.Data.SqlClient.dll 错误。我使用 NuGet 更新 SQLClient,但仍然收到这些错误:“异常抛出:Microsoft.Data.SqlClient.dll 中的'System.DllNotFoundException'和抛出异常:Microsoft.Data.SqlClient.dll 中的'System.TypeInitializationException'”所以追求那条路。
    • @C.AugustoProiete 您应该删除此答案。留下您建议的欺骗作为评论足以帮助发现。通过留下一个回答帖子(并像您一样享有很高的声誉),其他用户会看到您在做什么并模仿您的行为。然后我们必须向他们解释,不,他们不应该发布仅包含指向其他问题的链接的答案,即使他们看到一些声誉很高的用户这样做。请不要树立不良榜样 - 删除此答案。
    • @THedge 您应该使用您找到的相关错误信息更新您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多