Индивидуальная реализация ILogger - PullRequest
0 голосов
/ 27 ноября 2018

В моем проекте я часто добавляю префиксы к своим сообщениям журнала.

В настоящее время я делаю это с

  logger.LogDebug(prefix + " some message");

Я подумал, что это будет хороший способ реализовать собственный регистратор, в котором я устанавливаю префикс, и сам регистратор присоединяет его каждый раз, когда что-то регистрирует.

Итак, я создал свой собственный класс логгера и реализовал интерфейс ILogger.Но я не понимаю, как использовать метод

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)

для добавления префикса (который является членом пользовательского класса регистратора).

Мой полный код:

  public class CustomLogger : ILogger
  {

    private readonly ILogger _logger;
    private string _logPrefix;

    public CustomLogger(ILogger logger)
    {
      _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    _logPrefix = null;
    }

    public ILogger SetLogPrefix(string logPrefix)
    {
      _logPrefix = logPrefix;
      return this;
    }

    public IDisposable BeginScope<TState>(TState state)
    {
      return _logger.BeginScope(state);
    }

    public bool IsEnabled(LogLevel logLevel)
    {
      return _logger.IsEnabled(logLevel);
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
      _logger.Log(logLevel, eventId, state, exception, formatter);
    }

  }

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Реализация расширений для добавления prefix в записи журнала.

    public static class LogExtensions
    {
        public static void PrefixLogDebug(this ILogger logger, string message, string prefix = "Edward", params object[] args)
        {
            logger.LogDebug($"{prefix} {message}");
        }
    }

Использование:

        _log.PrefixLogDebug("Log From Prefix extension");
        _log.PrefixLogDebug("Log From Prefix extension", "New Prefix");
0 голосов
/ 29 ноября 2018

Лично я думаю, что это не очень хороший способ, «префикс» будет многократно дублироваться.Почему бы вам не использовать Log Scopes вместо этого?

public IActionResult GetById(string id)
{
    TodoItem item;
    using (_logger.BeginScope("Message attached to logs created in the using block"))
    {
        _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
        item = _todoRepository.Find(id);
        if (item == null)
        {
            _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
            return NotFound();
        }
    }
    return new ObjectResult(item);
}

Вывод

info: TodoApi.Controllers.TodoController[1002]
      => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApi.Controllers.TodoController.GetById (TodoApi) => Message attached to logs created in the using block
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApi.Controllers.TodoController.GetById (TodoApi) => Message attached to logs created in the using block
      GetById(0) NOT FOUND

В настоящее время вы не можете изменить шаблон ведения журнала, это ограничение встроенной базовой регистрации в Asp.net Core.Для более мощного вы можете попробовать Serilog , продолжать использовать интерфейс ILogger и изменить строку кода в program.cs class

Вы также должны посмотреть на это ПреимуществаСтруктурированное ведение журнала и базовое ведение журнала

0 голосов
/ 27 ноября 2018

Я думаю, что вы не должны вызывать _logger в пользовательском логгере.

Это будет циклический вызов во время выполнения, и результатом будет "префикс: префикс: префикс: префикс: префикс: префикс: префикс: ..."

Проще говоря, вы можетесоздайте простой регистратор и внедрите средство записи журналов, такое как консоль, средство записи базы данных, log4net, ...

Теперь, во-первых, вы должны изменить свой собственный регистратор, как показано ниже:

public class CustomLogger : ILogger
{
    private readonly string CategoryName;
    private readonly string _logPrefix;

    public CustomLogger(string categoryName, string logPrefix)
    {
        CategoryName = categoryName;
        _logPrefix = logPrefix;
    }

    public IDisposable BeginScope<TState>(TState state)
    {
        return new NoopDisposable();
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        string message = _logPrefix;
        if (formatter != null)
        {
            message += formatter(state, exception);
        }
        // Implement log writter as you want. I am using Console
        Console.WriteLine($"{logLevel.ToString()} - {eventId.Id} - {CategoryName} - {message}");
    }

    private class NoopDisposable : IDisposable
    {
        public void Dispose()
        {
        }
    }
}

Второйшаг, создайте регистратор провайдера:

 public class LoggerProvider : ILoggerProvider
    {     
        public ILogger CreateLogger(string categoryName)
        {                
            return new CustomLogger(categoryName, "This is prefix: ");
        }

        public void Dispose()
        {
        }
    }

Третий шаг, в Configure from Startup.cs:

loggerFactory.AddProvider(new MicroserviceLoggerProvider());
...