Serilog mssqlserver 接收器是否有内置配置设置来自动删除早于特定天数(或周或月)的日志条目?基本上,我正在寻找相当于rollinginterval设置的数据库,但它只是删除旧记录而不是滚动到新的日志文件。
如果没有,就不用解释如何用SQL删除记录了;我只是在 Serilog 中寻找捷径。
不,无法配置
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
删除旧日志必须手动完成(使用Hangfire或Quartz)。可以在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;
}
}
}