如何使 .net core 3.1 控制台应用程序中的控制台记录器工作
How to make console logger in .net core 3.1 console app work
我正在构建一个 .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");
}
}
它编译并运行,甚至将"Yup"写入控制台,但未显示"All done!"。
控制台输出 window:
这是我的示例项目结构:
我错过了什么?
这是对服务的处置:感谢 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 logic
logger.LogDebug("All done!");
}
Console.Write("Yup");
}
为了使日志记录不会对您的程序的性能产生不利影响,它可以异步编写。
处理日志提供程序和其他日志记录 类 应该会导致日志刷新。
服务提供者在处置时也应处置所有服务。
我可能会迟到,但值得添加一些输入以防有帮助。我也在努力解决这个登录 .net 核心的问题,并不断对最新版本进行重大更改。但是,不能抱怨,因为它越来越好。
这是我对发布的 .net core 5 所做的。
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 ";
}).SetMinimumLevel(LogLevel.Warning);
});
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();
}
我正在构建一个 .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");
}
}
它编译并运行,甚至将"Yup"写入控制台,但未显示"All done!"。
控制台输出 window:
这是我的示例项目结构:
我错过了什么?
这是对服务的处置:感谢 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 logic
logger.LogDebug("All done!");
}
Console.Write("Yup");
}
为了使日志记录不会对您的程序的性能产生不利影响,它可以异步编写。
处理日志提供程序和其他日志记录 类 应该会导致日志刷新。
服务提供者在处置时也应处置所有服务。
我可能会迟到,但值得添加一些输入以防有帮助。我也在努力解决这个登录 .net 核心的问题,并不断对最新版本进行重大更改。但是,不能抱怨,因为它越来越好。 这是我对发布的 .net core 5 所做的。
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 ";
}).SetMinimumLevel(LogLevel.Warning);
});
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();
}