Code: Select all
namespace MyApp.Cloud.Serilog.MQSink
{
public class MessageQueueSink : ILogEventSink
{
private readonly IMQProducer _MQProducerService;
public MessageQueueSink(IMQProducer mQProducerService)
{
_MQProducerService = mQProducerService;
}
public void Emit(LogEvent logEvent)
{
_MQProducerService.Produce(
new SendLog { LogEventJson = JsonConvert.SerializeObject(logEvent) }
);
}
}
}
< /code>
Der konsumierende Microservice beginnt so: < /p>
var configurationBuilder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var appSettings = configurationBuilder.Get();
configurationBuilder = new ConfigurationBuilder()
.AddJsonFile("ExtendedSettings.json")
.Build();
Host.CreateDefaultBuilder(args)
.UseMyAppCloudMQ(context => context.UseSettings(appSettings.MQSettings))
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureServices((hostContext, services) =>
{
services
.AddHostedService()
.Configure(configurationBuilder.GetSection("MQSettings"));
})
.Build()
.Run();
< /code>
Der Serilog-Teil von AppSettings.json sieht so aus: < /p>
{
"serilog": {
"Using": [
"Serilog.Sinks.File",
"Serilog.Sinks.Console",
"MyApp.Cloud.Serilog.MQSink"
],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithProcessId"
],
"WriteTo": [
{
"Name": "MessageQueueSink",
"Args": {}
}
]
}
}
Wie könnte dies gelöst werden? Ich habe keine Möglichkeit gefunden, dies mit AppSetings.json zu bearbeiten. Deshalb habe ich angefangen zu suchen, wie man dies in Code binden.
Code: Select all
public static class MySinkExtensions
{
public static LoggerConfiguration MessageQueueSink(
this Serilog.Configuration.LoggerSinkConfiguration loggerConfiguration,
MyApp.Cloud.MQ.Interface.IMQProducer mQProducer = null)
{
return loggerConfiguration.Sink(new MyApp.Cloud.Serilog.MQSink.MessageQueueSink(mQProducer));
}
}
< /code>
Dies ermöglichte es, die benutzerdefinierte Spüle wie folgt hinzuzufügen: < /p>
Host.CreateDefaultBuilder(args)
.UseMyAppCloudMQ(context => context.UseSettings(appSettings.MQSettings))
.ConfigureServices((hostContext, services) =>
{
services.Configure(
configurationBuilder.GetSection("MQSettings")
);
})
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.WriteTo.MessageQueueSink()
)
.Build()
.Run();
< /code>
Die benutzerdefinierte Spüle wird geladen und der Emit wird ausgelöst, aber ich weiß immer noch nicht, wie ich den MQ in die Spüle injizieren kann? Es wäre auch viel besser, wenn ich die gesamte Konfiguration des Serilogs und in der Datei appsettings.json