Как создать MessageTemplateTokens для Serilog LogVents в C# .net8 (Core) (в проекте обслуживания работников)C#

Место общения программистов C#
Ответить
Anonymous
 Как создать MessageTemplateTokens для Serilog LogVents в C# .net8 (Core) (в проекте обслуживания работников)

Сообщение Anonymous »

Я использую Serilog в моем проекте C# .net 8 Service Service. Я хочу особое поведение и записал раковину для фильтрации журнала.
В файле программы. >

Код: Выделить всё

// 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();
}
my duplicatefiltersink класс выглядит следующим образом:

Код: Выделить всё

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;
}
}
}
Идея состоит в том, что если Logevent соответствует предыдущему logEvent , она не будет испускана, а только подсчитывается. Как только LogEvent не соответствует предыдущему logEvent , а количество больше нуля, он издает сообщение, в котором говорилось, что предыдущее сообщение произошло x раз, а затем излучит новое сообщение. Это предотвратит заполнение сбежавших сообщений в плотном цикле. Полем Я считаю, что это потому, что я использую пустой массив MessageTemplAteTetoken . Это единственная разница между duplicatmessage logevent и logevent это параметр.
Если это проблема, я не Знайте, как это исправить. MessageTemplayTetOken - это абстрактный класс, поэтому я не могу создать его, и я не могу найти какой -либо класс, который происходит от него. Я также не могу использовать существующий MessageTemplateTetokens из logEvent параметра MessageTemplate , потому что мне придется изменить текст внутри него, и текстовое свойство только для чтения. br />
  • Вопрос № 1 < /strong>: это моя проблема? Blank MessageTemplAteTetOken приводит к тому, что мой излучаемый logEvent написать пустую строку?
  • Вопрос # # 2 : есть ли способ создать действительный MessageTemplate с действительным MessageTemplateTetoken массив?


Подробнее здесь: https://stackoverflow.com/questions/794 ... -net8-core
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»