Есть ли способ AutoFlush TextWriterTraceListener - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть простое консольное приложение с ядром 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...