.net - 将 .NET Core 登录到文件和控制台 - 带有时间戳

标签 .net logging dependency-injection .net-core timestamp

我是 .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 loggercustom file logger .

关于.net - 将 .NET Core 登录到文件和控制台 - 带有时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105619/

相关文章:

dependency-injection - 使用 IOC 框架绑定(bind)到多个具体实现?

c# - 使用简单注入(inject)器注册开放通用单例

java - 哪种 bean 类是可注入(inject)的?

c# - 通过网络优化 Dictionary.EnumerateFiles

.net - 如何通过C++/CLI创建.Net扩展方法?

c# - 从具有多个零值的枚举中获取项目名称

php - 记录在数据库上执行了哪些事件的方法? -MySQL/PHP

.net - C# 数组 : finding custom minimal element

.net - 温莎城堡 : "LoggingFacility.UseNLog() is obsolete"

laravel - 使用 Slack Channel 自定义 Laravel Log 的消息