使用SeriLog的Windows服务没有日志保存到MS SQL Server

问题描述

我创建了一个.net Framework Windows Service应用程序,该应用程序应该使用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.@R_823_4045@ion("Started Grabbing Data");
}

现在有人能阻止日志记录发生了吗?

编辑
我已经在控制台应用程序中使用了此确切的代码,并且正在将其写入sql Server,但是当我发布Windows Service App并将其作为服务运行时,就不会记录任何日志。

解决方法

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

Serilog.Sinks.MSSqlServer是一个“定期批处理接收器”,因此日志不会立即写入数据库。您可能需要调整configuration options related to batching of messages。还请记住,服务停止时请刷新日志,否则您可能会丢失消息。参见Lifecycle of Loggers

您可以采取许多步骤来解决SQL Server接收器无法正常工作的问题。下面的答案描述了常见的问题:

Serilog MSSQL Sink doesn't write logs to database

,

您正在初始化var log,但要通过静态Log类进行登录。要启用静态Log类,您需要初始化Log.Logger