我是 .NET 核心的新手,还没有机会深入研究依赖注入(inject)。但我理解这个概念,并且知道这是一件好事,而且我的应用程序也需要它。因为在某些时候可能需要增强或切换日志记录功能。
我已经启动了一个使用类库(.net Standard 2.0)的控制台应用程序,并且应该将内容记录到控制台以及日志文件。
目前,我遵循了一些指南并使用 Microsoft.Extensions.Logging.Console 配置了日志记录(还没有任何文件)。该记录器的输出是,它为每个条目写入两行,例如:
info: SampleWebConsoleApp.Program[0]
This is a test of the emergency broadcast system.
我不了解你,但我有点不喜欢登录两行的输出。我的大脑无法解析这个:-)。我喜欢它在一行中,并且在开始时带有时间戳。据我发现,控制台记录器似乎无法更改为单行并在其中包含时间戳。
于是我的旅程开始了。我发现了像 Serilog、NLog 或我过去使用的老 friend log4net 之类的东西。
我尝试使用 Serilog,因为它看起来简单易行,而且它还有一个用于记录我也需要的文件的记录器。所以我开始扔掉旧的控制台记录器,整合 Serilog 控制台和文件记录器。但后来我发现了一些这样的例子:
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.File("consoleapp.log")
.CreateLogger();
...
}
但这似乎与我对依赖注入(inject)的稀疏知识相矛盾,因为我认为它应该像这样配置(假设!):
private static void ConfigureServices(IServiceCollection services)
{
...
services.Configure<UnknownSerilogConfigurationClass>(config => config.FileName = "consoleapp.log");
}
我看到有人提到,Serilog 本身就是一个记录器工厂,因此是 DI 的反模式。
所以现在我有点困惑从这里去哪里。
对于一个相当简单的控制台应用程序,我应该使用什么支持依赖注入(inject)的日志记录框架?必须是,我应该允许,配置输出,使其包含时间戳,并且输出应该在单行上。
有什么建议么?
最佳答案
您可以使用NLog .配置很简单。配置完成后,只需注入(inject) ILogger<T>
在哪里 T
是使用记录器的类类型。
nlog.config 文件 (不要忘记将其复制到输出目录)
<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true" >
<!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="target1" fileName="${basedir}/LogFile.txt"
layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
<target xsi:type="Console" name="target2"
layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<logger name="*" minlevel="Trace" writeTo="target1,target2" />
</rules>
</nlog>
.NET Core 2.2 应用程序
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;
namespace ConsoleApp1
{
public class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton<IFooService, FooService>()
.AddLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddNLog(new NLogProviderOptions
{
CaptureMessageTemplates = true,
CaptureMessageProperties = true
});
})
.BuildServiceProvider();
ILogger<Program> logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogInformation("Starting application...");
var fooService = serviceProvider.GetService<IFooService>();
fooService.DoWork();
Console.ReadLine();
}
}
}
食品服务
using Microsoft.Extensions.Logging;
namespace ConsoleApp1
{
public interface IFooService
{
void DoWork();
}
public class FooService : IFooService
{
private readonly ILogger _logger;
public FooService(ILogger<FooService> logger)
{
_logger = logger;
}
public void DoWork()
{
_logger.LogInformation("Doing work.");
}
}
}
应用输出
2019/03/19 23:03:44.875|INFO|Starting application... |ConsoleApp1.Program|
2019/03/19 23:03:44.920|INFO|Doing work. |ConsoleApp1.FooService|
或者,如果您不想使用 NLog 或任何其他日志记录提供程序,您可以创建自己的 custom console logger和 custom file logger .
关于.net - 将 .NET Core 登录到文件和控制台 - 带有时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105619/