So erstellen Sie MessAgetemPlatetokens für Serilog -Logevents in C# .NET8 (CORE) (in einem Worker Service -Projekt)C#

Ein Treffpunkt für C#-Programmierer
Guest
 So erstellen Sie MessAgetemPlatetokens für Serilog -Logevents in C# .NET8 (CORE) (in einem Worker Service -Projekt)

Post by Guest »

Ich verwende Serilog in meinem C# .NET 8 Worker Service Project. Ich möchte ein spezielles Verhalten und habe eine Spüle geschrieben, um die Protokollierung zu filtern. >

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();
}
Meine DuplicateFilterSink Die Klasse sieht so aus:

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;
}
}
}
Die Idee ist, dass das LogeVvent mit dem vorherigen LogeVvent nicht abgibt, sondern nur gezählt wird. Sobald der LogeVvent nicht mit dem vorherigen Logevent übereinstimmt und die Anzahl größer als Null ist, wird eine Nachricht angezeigt, in der die vorherige Nachricht x -mal stattgefunden hat und dann die neue Nachricht ausgibt. Dies verhindert, dass außer Kontrolle geratene Nachrichten in einer engen Schleife meine Protokolldateien ausfüllen. . Ich glaube, das liegt daran, dass ich ein leeres MessAgetemplatEtekoken -Array verwende. Dies ist der einzige Unterschied zwischen der DuplicatMessage LogeVvent und dem LogeVvent Das ist der Parameter.
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?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post