使用 Serilog mssqlserver 接收器自动删除旧日志条目?

问题描述 投票:0回答:1

Serilog mssqlserver 接收器是否有内置配置设置来自动删除早于特定天数(或周或月)的日志条目?基本上,我正在寻找相当于rollinginterval设置的数据库,但它只是删除旧记录而不是滚动到新的日志文件。

如果没有,就不用解释如何用SQL删除记录了;我只是在 Serilog 中寻找捷径。

sql-server serilog
1个回答
0
投票

不,无法配置

Serilog.Sinks.MSSqlServer
接收器来自动删除数据库中的旧日志条目。

以下 GitHub 问题回答了它从未实施的原因:

https://github.com/serilog-mssql/serilog-sinks-mssqlserver/issues/221

https://github.com/serilog-mssql/serilog-sinks-mssqlserver/issues/375

https://github.com/serilog-mssql/serilog-sinks-mssqlserver/issues/104

删除旧日志必须手动完成(使用HangfireQuartz)。可以在here找到有关如何使用 Quartz 完成此操作的示例:

using System.Data.SqlClient;
using Microsoft.Extensions.Logging;
using Quartz;
using System.Threading.Tasks;
using LovoldErpBackendApi.Helpers;
using Microsoft.Extensions.Options;

namespace LovoldErpBackendApi.Jobs
{
    [DisallowConcurrentExecution]
    public class CleanSerilogDataTableJob : IJob
    {

        private readonly ILogger<CleanSerilogDataTableJob> _logger;
        private static int _counter = 0;
        private readonly AppSettings _appSettings;
        private readonly SerilogSettings _serilogSettings;
        
        public CleanSerilogDataTableJob(ILogger<CleanSerilogDataTableJob> logger, IOptions<AppSettings> appSettings,  IOptions<SerilogSettings> serilogSettings)
        {
            _logger = logger;
            _appSettings = appSettings.Value;
            _serilogSettings = serilogSettings.Value;
        }
        
        public async Task Execute(IJobExecutionContext context)
        {
            if (_appSettings.IsProduction.ToLower().Contains("true") && _serilogSettings.SaveToDatabase == true && !string.IsNullOrWhiteSpace(_serilogSettings.DatabaseConnectionString))
            {
                var count = _counter++;
                var message = $"Clean Serilog Data Table Job Count: {count}";
                _logger.LogInformation(message);
                
                string constr = _serilogSettings.DatabaseConnectionString;
                using (SqlConnection con = new SqlConnection(constr))
                {
                    string query = "DELETE FROM Logs WHERE TimeStamp < DATEADD(day, -7, GETDATE());";
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        con.Open();
                        int deletedRows = cmd.ExecuteNonQuery();
                        
                        message = $"Clean Serilog Data Table Job Rows Deleted: {deletedRows}";
                        _logger.LogInformation(message);
                        
                        con.Close();
                    }
                }    
            }
            
            return;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.