首页 > 解决方案 > 使用 SeriLog 的 Windows 服务 没有日志保存到 MS SQL Server

问题描述

我创建了一个 .net 框架 windows 服务应用程序,它应该使用 serilog 和 MS SQL Server 来记录消息和任何潜在的错误。我的问题是没有任何东西被记录到 MS SQL Server,所以我不确定问题是什么。

作为一个例子(我删除了我的敏感代码) - 我在publice Service1()方法中有我对 SeriLog 的初始化,然后我希望一个进程每 5 分钟运行一次,所以在OnStart()我设置了计时器并使用此代码

public Service1()
{
    InitializeComponent();

    var log = new LoggerConfiguration()
        .WriteTo.MSSqlServer(
            connectionString: "data source=ZZZZZZZZ;Initial Catalog=ZZ;Persist Security Info=False;User Id=ZZ; Password=ZZZ;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;",
            sinkOptions: new SinkOptions
            {
                TableName = "SeriLog",
                SchemaName = "dbo",
                AutoCreateSqlTable = false
            })
        .CreateLogger();
}

protected override void OnStart(string[] args)
{
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    timer.Interval = 300000;
    timer.Enabled = true;
}

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    GetData().GetAwaiter().GetResult();
}
private static async Task GetData()
{
    Log.Information("Started Grabbing Data");
}

现在有没有人看到任何会阻止日志记录发生的事情?

编辑
我在控制台应用程序中使用了这个确切的代码,它正在写入 SQL Server,但是当我发布我的 Windows 服务应用程序并将它作为服务运行时,没有记录任何日志。

标签: c#windows-servicesserilog

解决方案


在解决 Serilog 问题时,您应该做的第一件事是启用SelfLog,以查看是否有任何异常被抛出。例如,如果接收器无法连接到 SQL Server,或者表有问题,您将在SelfLog中收到错误消息。

Serilog.Sinks.MSSqlServer是“定期批处理接收器”,因此不会立即将日志写入数据库。您可能想要调整与消息批处理相关的配置选项。还记得在服务停止时刷新日志,否则您可能会丢失消息。请参阅记录器的生命周期

您可以采取许多步骤来解决 SQL Server 接收器不工作的原因。下面的答案中描述了常见的:

Serilog MSSQL Sink 不会将日志写入数据库


推荐阅读