.Net Core 1.1 не сериализует объект при регистрации
У меня есть приложение ASP.NET Core 1.1, и я использую Serilog для ведения журнала. Я хочу войти в DTO-объект, сохранив его структуру.
Так что, если я напрямую использую Serilog.Log
войти в DTO, как показано ниже
Serilog.Log.Information("Processing {@DTO}", dto);
Затем Serilog сериализует DTO и регистрирует его, как и ожидалось.
Однако я делаю инъекцию Microsoft.Extension.Logging.ILogger
в контроллер. Я думал, что он будет использовать настроенный регистратор для регистрации, и это будет сериализовать объект во время регистрации, но это не так. Он только регистрирует имя типа объекта.
public class HomeController
{
private readonly Microsoft.Extensions.Logging.ILogger _logger = null
public HomeController(Microsoft.Extensions.Logging.ILogger logger)
{
_logger = logger;
}
public asyc IActionResult Index()
{
var dto = GetDTO();
//did not work
_logger.LogInformation("DTO {dto}",dto);
//did not work
_logger.LogInformation("DTO {@dto}",dto);
//worked when i use serilog directly
Serilog.Log.Information("DTO {@dto}",dto);
//did not work
Serilog.Log.Information("DTO {dto}",dto);
}
}
Startup.cs
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
}
appsettings.json
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Information"
}
},
"Serilog": {
"WriteTo": [
{
"Name": "ColoredConsole"
}
]
},
1 ответ
Я нашел это. Виноват
в Startup.cs
в методе Configure я только добавляю Serilog
для среды не разработки, и я тестировал локально с ASPNETCORE_ENVIRONMENT = Разработка.
if(!env.IsDevelopment())
{
loggerFactory.AddSerilog();
}
Я удалил, если условие, и это сработало. Так _logger.LogInformation("DTO {@dto}",dto);
работает