Code: Select all
// 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();
}
Code: Select all
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;
}
}
}
Wenn dies das Problem ist, bin ich nicht wissen, wie man es korrigiert. Das MessAgetemPlatEtoken ist eine abstrakte Klasse, daher kann ich sie nicht instanziieren und kann keine Klasse finden, die daraus abgeleitet ist. Ich kann auch nicht die vorhandenen MessAgetemPlateTokens aus der MessAgetemplate des Parameters des LogeVvent verwenden, da ich den Text in ihm ändern müsste und die Texteigenschaft nur schreibgeschützt ist. < Br />
Frage 1 < /strong>: Ist das mein Problem? Ist das leere MessAgetemPlatEtoken -Array dazu führt, dass mein emittiertes logevent eine leere Zeile schreibt? 2 : Gibt es eine Möglichkeit, eine gültige MessAgetemplate mit einem gültigen MessAgetemPlatEToken Array zu erstellen?>