У меня есть простое консольное приложение с ядром dotnet, и я пытаюсь заставить TextWriterTraceListener очищаться без явного вызова. Есть ли способ сделать это?
internal class Program {
// need this available to flush at the end
private static TextWriterTraceListener _listener;
private static void Main(string[] args) {
using (var serviceProvider = ConfigureServices()) {
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogDebug("Starting application.");
var questionRepo = serviceProvider.GetRequiredService<ICustomService>();
var result = questionRepo.GetQuestionById(3);
logger.LogDebug("Finishing application.");
_listener.Flush(); //would rather not do this
}
}
private static ServiceProvider ConfigureServices() {
var services = new ServiceCollection();
ConfigureTraceSourceLogging();
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.Build();
services.AddLogging(
logBuilder => {
logBuilder.AddConfiguration(config.GetSection("Logging"))
.AddTraceSource(new SourceSwitch("sourceSwitch", SourceLevels.All.ToString()),
_listener)
.AddConsole();
});
// Use one instance via the open generic in MS Logging
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddSingleton<ICustomService, CustomService>();
return services.BuildServiceProvider();
}
private static void ConfigureTraceSourceLogging() {
var writer = File.CreateText($"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}\\output.log");
writer.AutoFlush = true; // doesn't seem to work
_listener = new TextWriterTraceListener(writer.BaseStream);
}
}
Кроме того, причина, по которой я не выбрал другой фреймворк, такой как NLog и т. Д., Заключается в том, что мне действительно нравится открытая универсальная реализация, поэтому мне не нужно объявлять каждый тип, для которого мне нужен регистратор. Я начал с NLog и не смог найти способ сделать это, поэтому выбрал TraceListener.