將 .NET Core 登錄到文件和控制台 - 帶有時間戳
我是 .NET 核心的新手,還沒有機會深入研究依賴注入。但我理解這個概念,並且知道這是一件好事,而且我的應用程序也需要它。因為在某些時候可能需要增強或切換日誌記錄功能。
我已經啟動了一個使用類庫(.net Standard 2.0)的控制台應用程序,並且應該將內容記錄到控制台以及日誌文件。
目前,我遵循了一些指南並使用 Microsoft.Extensions.Logging.Console 配置了日誌記錄(還沒有任何文件)。該記錄器的輸出是,它為每個條目寫入兩行,例如:
info: SampleWebConsoleApp.Program[0] This is a test of the emergency broadcast system.我不了解你,但我有點不喜歡登錄兩行的輸出。我的大腦無法解析這個:-)。我喜歡它在一行中,並且在開始時帶有時間戳。據我發現,控制台記錄器似乎無法更改為單行並在其中包含時間戳。
於是我的旅程開始了。我發現了像 Serilog、NLog 或我過去使用的老朋友 log4net 之類的東西。
我嘗試使用 Serilog,因為它看起來簡單易行,而且它還有一個用於記錄我也需要的文件的記錄器。所以我開始扔掉舊的控制台記錄器,整合 Serilog 控制台和文件記錄器。但後來我發現了一些這樣的例子:
static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .WriteTo.File("consoleapp.log") .CreateLogger(); ... }但這似乎與我對依賴注入的稀疏知識相矛盾,因為我認為它應該像這樣配置(假設!):
private static void ConfigureServices(IServiceCollection services) { ... services.Configure<UnknownSerilogConfigurationClass>(config => config.FileName = "consoleapp.log"); }我看到有人提到,Serilog 本身就是一個記錄器工廠,因此是 DI 的反模式。
所以現在我有點困惑從這裡去哪裡。
對於一個相當簡單的控制台應用程序,我應該使用什麼支持依賴注入的日誌記錄框架?必須是,我應該允許,配置輸出,使其包含時間戳,並且輸出應該在單行上。
有什麼建議麼?
您可以使用NLog。配置很簡單。配置後,您需要做的就是
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(); } } }FooService
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|