Dot-Net

將 .NET Core 登錄到文件和控制台 - 帶有時間戳

  • January 28, 2021

我是 .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|

或者,如果您不想使用 NLog 或任何其他日誌記錄提供程序,您可以創建自己的自定義控制台記錄器自定義文件記錄器

引用自:https://stackoverflow.com/questions/55105619