问题描述
我在 .net core 3.1 中拥有该项目。我已配置为使用 SeriLog 作为记录器。
其中一项服务 MqttComunicationClient
将记录器注入到使用 serilog 配置的构造函数中。这里的 ILogger
是 Microsoft.Extensions.Logging
public MqttCommunicationClient(
IMqttCommunicationConfiguration mqttConfiguration,ILogger logger,)
{
this.mqttConfiguration = mqttConfiguration;
this.logger = logger;
}
从这个类的 Init
方法中,我正在初始化自定义编写的 MQTT API。
public void Initialize()
{
var mqttClientId = $"{DefaultClientIdPattern}{Environment.MachineName}";
serviceHost = Host.CreateDefaultBuilder()
.UseMQTTApi(opt =>
{
opt.UserName = "test";
opt.Password = "test";
})
.ConfigureServices(services =>
{
services.AddSingleton(logger);
})
.ConfigureHostConfiguration(c => { c.Build(); })
.Start();
managedMqttClient = serviceHost.Services.GetRequiredService<IManagedMqttClient>();
}
我的 MQTT Api 具有处理程序,这些处理程序将在接收到指定主题的消息时触发。
其中一个处理程序具有以下构造函数。
public ConnectionStatusHandler(
ILogger<ConnectionStatus> logger,IDeviceCommunications deviceCommunications)
{
this.logger = logger;
this.deviceCommunications = deviceCommunications;
}
现在的问题是当我调试我的 MqttComunicationClient
时,记录器被配置为 SeriLog
。根据该类中使用的要求和配置,logger.LogInformation()
正在记录到日志文件。
当调用 ConnectionStatusHandler
时,logger
会更改为 Microsoft.Extensions.Logging.Logger
记录器。
ConnectionStatusHandler
类中使用的记录器仅记录到控制台,而不记录到文件中。
如何将相同的 serilog 配置的 logger
对象从 MqttComunicationClient
传递到 ConnectionStatusHandler
?
我需要一些额外的设置吗?我是新手,因此非常感谢您的帮助。
编辑
将 serilog
配置为记录器
public IServiceProvider CreateServiceProvider(string basePath)
{
var configuration = GetConfiguration(basePath);
var logger = CreateLogger(configuration);
var services = new ServiceCollection();
services.AddSingleton(logger);
return services.BuildServiceProvider();
}
protected virtual ILogger CreateLogger(IConfiguration configuration)
{
return LogBuilder.CreateLogger(null,configuration);
}
// Serilog configured here
public static ILogger CreateLogger(string categoryName,IConfiguration configuration,Action<string> selfLogAction = null)
{
var serilogLogger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
using (var serilogLoggerProvider = new SerilogLoggerProvider(serilogLogger))
{
var logger = serilogLoggerProvider.CreateLogger(categoryName);
if (selfLogAction != null)
{
Serilog.Debugging.SelfLog.Enable(selfLogAction);
}
return logger;
}
}
// This method reads the configuration from the config json file.
protected virtual IConfiguration GetConfiguration(string basePath)
{
StringBuilder configLog = null;
var mainConfiguration = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("mytest.config.json")
.Build();
var builder = new ConfigurationBuilder();
return BuildConfiguration(builder,mainConfiguration,basePath,configLog)
.Build();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)