Вход в .NET Core в файл и на консоль - с отметками времени - PullRequest
2 голосов
/ 11 марта 2019

Я новичок в ядре .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.

Так что теперь я немного озадачен тем, куда идти.

Какую структуру ведения журналов, поддерживающую внедрение зависимостей, следует использовать для довольно простого консольного приложения?Должно быть то, что он должен позволять мне настраивать вывод так, чтобы он включал метку времени, а вывод должен быть в одной строке.

Есть предложения?

1 Ответ

7 голосов
/ 20 марта 2019

Вы можете использовать NLog .Конфигурация проста.После настройки все, что вам нужно сделать, это ввести ILogger<T>, где T - это тип класса, который использует регистратор.

nlog.config file (не забудьте скопировать его вкаталог вывода)

<?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 или любого другого провайдера журналов, вы можете создать свой собственный пользовательский консольный регистратор и пользовательский файлрегистратор .

...