Необходим тип производного класса C# в базе для ведения журнала с помощью NLog

Мы используем NLog для ведения журнала в веб-приложении C# MVC3. Все наши контроллеры расширяют пользовательскую базу "ApplicationController", которая дает нам доступ к постоянно необходимым методам и членам.

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

Наш контроллер приложения выглядит следующим образом:

public abstract class ApplicationController : Controller
{
    protected Logger _logger;
    protected virtual Logger Logger
    {
        get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
    }

    protected ApplicationController()
    {
        Context = new Entities();
    }

Если производный контроллер не переопределит Logger, то все утверждения будут показывать, что они исходят от контроллера Application. В настоящее время у меня по сути один и тот же оператор Logger во всех производных контроллерах. Например:

public class PropertyController : ApplicationController
{
    private readonly DatatapeService _datatapeService;
    private readonly PropertyService _propertyService;
    protected override Logger Logger
    {
        get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
    }

Очевидно, что это плохая практика реализации.

  1. Как я могу это исправить? В частности, чего в моем понимании C# не хватает для решения именно этой конкретной задачи?
  2. Существует ли паттерн протоколирования, которому я должен следовать, где я не раскрываю класс протоколирования (NLog) напрямую?

TIA!

11
задан Bobby B 3 January 2012 в 11:07
поделиться

1 ответ

, Как создать Регистратор для sub классов страница , NLog wiki теперь предлагает следующий шаблон:

class BaseClass
{
    protected BaseClass()
    {
        Log = LogManager.GetLogger(GetType().ToString());
    }

    protected Logger Log { get; private set; }
}

class ExactClass : BaseClass
{
    public ExactClass() : base() { }
    ...
}
0
ответ дан 3 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: