Код: Выделить всё
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>
Потребляемая микросервиса запускается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>
serilog part of appsettings.json выглядит так: < /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": {}
}
]
}
}
Как это может быть решено? Я не нашел какого-либо способа заставить это работать с appsetings.json , поэтому я начал смотреть на то, как связать это в коде.
Код: Выделить всё
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>
Это позволило добавить пользовательскую раковину, как это: < /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>
Пользовательская раковина загружается, а эмит запускается, но я все еще не знаю, как вводить MQ в раковину? Также было бы намного лучше, если бы я мог сделать всю конфигурацию Serilog и погрузиться в файл appsettings.json
Подробнее здесь: https://stackoverflow.com/questions/711 ... -injection