Вход в консольное приложение ядра.Net не работает
Я следую этому руководству: https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/
и соответственно установил пакеты, но журнал нигде не печатается.
Это мой код:
var serviceProvider = new ServiceCollection()
.AddLogging()
.AddTransient<IFoo, Foo>(s =>
{
return new Foo()})
.BuildServiceProvider();
//configure console logging
serviceProvider
.GetService<ILoggerFactory>()
.AddConsole(LogLevel.Debug);
var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Program>();
logger.LogError("Starting application");
4 ответа
Оказывается, провайдер логирования консоли не сразу сбрасывает сообщения на консоль, как это было в версиях net-core-1.x. Кажется, он работает в другом потоке. См. Эту веб-страницу для информации: https://github.com/aspnet/Logging/issues/631
Вы можете добавить в конце основной функции.
serviceProvider.Dispose();
или вы можете добавить .AddDebug()
serviceProvider
.GetService<ILoggerFactory>()
.AddConsole(LogLevel.Debug)
.AddDebug();
Создание нового ServiceProvider и HostBuilder может не стоить того, если мы просто хотим использовать консольное приложение для входа в систему, потому что очистить или утилизировать его нужно с осторожностью. Скорее, я бы предложил просто иметь Logging Factory для использования регистратора, и это решит проблему ведения журнала, если это только то, что мы хотим.
public static class ApplicationLogging
{
public static ILoggerFactory LogFactory { get; } = LoggerFactory.Create(builder =>
builder.ClearProviders();
// Clear Microsoft's default providers (like eventlogs and others)
builder.AddSimpleConsole(options =>
{
options.IncludeScopes = true;
options.SingleLine = true;
options.TimestampFormat = "hh:mm:ss ";
});
builder.AddApplicationInsights("instrument-key");
});
public static ILogger<T> CreateLogger<T>() => LogFactory.CreateLogger<T>();
}
static void Main(string[] args)
{
var logger = ApplicationLogging.CreateLogger<Program>();
logger.LogInformation("Let's do some work");
logger.LogWarning("I am going Crazy now!!!");
logger.LogInformation("Seems like we are finished our work!");
Console.ReadLine();
}
Я попал в эту ветку, пытаясь выяснить, почему не работало ведение журнала на консоли, и этот ответ документирует найденное. Используемые пакеты: Microsoft.Extensions.Logging Microsoft.Extensions.Logging.Console Microsoft.Extensions.Logging.Debug
Приложение: консоль.NET Core 2.2 (Microsoft.NET.Sdk, netcoreapp2.2). Используя Microsoft.Extensions.Hosting.IHost, вот как я добавил консольное ведение журнала:
var hostBuilder = new HostBuilder()
// Other Configuration omitted for brevity
.ConfigureLogging((hostBuilderContext, loggingBuilder) =>
{
loggingBuilder.AddConfiguration(hostBuilderContext.Configuration.GetSection("Logging"));
loggingBuilder.AddConsole(options =>
{
options.IncludeScopes = true;
});
loggingBuilder.AddDebug();
});
// Start the application
await hostBuilder.RunConsoleAsync();
Интересно, что если я удаляю параметр options в вызове AddConsole, я не вижу никакой регистрации. Я считаю, что это так, потому что я использую ILogger в своем коде, который испускает операторы журнала:
public class ClassThatLogs
{
private readonly ILogger<ClassThatLogs> _logger;
public ClassThatLogs(ILogger<ClassThatLogs> logger)
{
_logger = logger;
}
public void DoWork()
{
_logger.LogInformation("Working");
}
}
Если я опубликую консольное приложение как:
один файл _log.LogDebug не дает вывода
когда я публикую его не как отдельный файл (поэтому я только снимаю флажок с одного файла), _log.LogDebug выводит на консоль все мои операторы отладки. Никаких других изменений, кроме снятия отметки с одного файла.
Таким образом, только сняв флажок «создать один файл», мой _logging.LogDebug начинает записывать данные в консоль.
Кажется, это: https://github.com/serilog/serilog-settings-configuration/issues/244