我已经Main像这样配置了控制台应用程序
var services = new ServiceCollection()
.AddLogging(logging => logging.AddConsole())
.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)
然后我尝试在另一个类中使用它
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void MyFunc()
{
_logger.Log(LogLevel.Error, "My Message");
}
Run Code Online (Sandbox Code Playgroud)
System.InvalidOperationException:'无法解析类型为'Microsoft.Extensions.Logging.ILogger的服务'
根据以下Yaakov的评论和Github的评论进行编辑,我能够通过此操作正确解决它
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
我本来希望在初始时使用它,BuildServiceProvider但看起来每次要使用记录器(或创建自己的ILogger)时都必须重复此操作。
我正在构建一个 .Net Core 3.1 控制台应用程序,我想在控制台日志记录中使用构建。关于 .net 日志记录的文章数不胜数,但我无法找到实际在控制台中写入的示例。
namespace test
{
class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddLogging(config => config.ClearProviders().AddConsole().SetMinimumLevel(LogLevel.Trace))
.BuildServiceProvider();
//configure console logging
serviceProvider
.GetService<ILoggerFactory>();
var logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogDebug("All done!");
Console.Write("Yup");
}
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行,甚至向控制台写入“Yup”,但是“All done!” 未显示。控制台窗口中的输出:
我错过了什么?
这是对服务的处理:感谢 Jeremy Lakeman 修复:
static void Main(string[] args)
{
using (var serviceProvider = new ServiceCollection()
.AddLogging(config => config.ClearProviders().AddConsole().SetMinimumLevel(LogLevel.Trace))
.BuildServiceProvider())
{
//configure console logging
serviceProvider
.GetService<ILoggerFactory>();
var logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
// run app …Run Code Online (Sandbox Code Playgroud) 我使日志输出如下:
static void Main(string[] args)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole();
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation(
"This is a test of the emergency broadcast system.");
Console.WriteLine("Press any key...");
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
我收到消息:
信息:ConsoleLogging.Program[0]
这是对紧急广播系统的一次测试。
但我想这样:
信息:这是对紧急广播系统的测试。
如何格式化控制台中日志的输出?我使用 Microsoft.Extensions.Logging、Microsoft.Extensions.Logging.Console 库。