В файле программы. >
Код: Выделить всё
// Method to configure Serilog with DuplicateFilterSink
Serilog.ILogger CreateSerilogLogger()
{
LoggerConfiguration loggerConfig = new LoggerConfiguration()
.WriteTo.Console() // for debugging
.WriteTo.File(
path: Settings.Default.LogFileSpec, // base file name
rollingInterval: RollingInterval.Day, // automatically creates a new file daily
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
);
// Add Event Log only for Windows
if (OperatingSystem.IsWindows())
{
loggerConfig.WriteTo.EventLog(
source: Settings.Default.EventLogSource,
logName: Settings.Default.EventLogName,
restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Warning
);
}
DuplicateFilterSink duplicateFilterSink = new DuplicateFilterSink(loggerConfig.CreateLogger());
return new LoggerConfiguration()
.WriteTo.Sink(duplicateFilterSink)
.CreateLogger();
}
Код: Выделить всё
public class DuplicateFilterSink : ILogEventSink
{
private readonly ILogEventSink _innerSink;
private LogEvent? _lastLogEvent;
private int _duplicateCount = 0;
public DuplicateFilterSink(ILogEventSink innerSink)
{
_innerSink = innerSink;
}
public void Emit(LogEvent logEvent)
{
// Check if the message is the same as the previous one
if (_lastLogEvent != null && logEvent.MessageTemplate.Text == _lastLogEvent.MessageTemplate.Text)
{
_duplicateCount++;
}
else
{
// If the message has changed, log the previous duplicate count
if (_duplicateCount > 0)
{
List properties = new List();
foreach (var thing in logEvent.Properties)
{
LogEventProperty property = new LogEventProperty(thing.Key, thing.Value);
properties.Add(property);
}
string dupmsg = $"The previous message occurred {_duplicateCount} times";
MessageTemplate duplicateTemplate = new MessageTemplate(dupmsg, Array.Empty());
LogEvent duplicateMessage = new LogEvent(
logEvent.Timestamp,
logEvent.Level,
logEvent.Exception,
duplicateTemplate,
properties.ToArray()
);
_innerSink.Emit(duplicateMessage);
_duplicateCount = 0;
}
// Log the new message
_innerSink.Emit(logEvent);
_lastLogEvent = logEvent;
}
}
}
Если это проблема, я не Знайте, как это исправить. MessageTemplayTetOken - это абстрактный класс, поэтому я не могу создать его, и я не могу найти какой -либо класс, который происходит от него. Я также не могу использовать существующий MessageTemplateTetokens из logEvent параметра MessageTemplate , потому что мне придется изменить текст внутри него, и текстовое свойство только для чтения. br />
- Вопрос № 1 < /strong>: это моя проблема? Blank MessageTemplAteTetOken приводит к тому, что мой излучаемый logEvent написать пустую строку?
- Вопрос # # 2 : есть ли способ создать действительный MessageTemplate с действительным MessageTemplateTetoken массив?
Подробнее здесь: https://stackoverflow.com/questions/794 ... -net8-core
Мобильная версия