Использование Log4Net внутри интерфейса

У меня есть интерфейс

public interface ILoggerService
{
    void Info(string message);
    void Warn(string message);
}

Затем у меня есть класс, который реализует этот интерфейс и журналы, используя Log4Net

public class Log4NetLoggerService : ILoggerService
{
    private readonly ILog _logger;
    public Log4NetLoggerService()
    {
        // this always returns Log4NetLoggerService class type
        _logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    }

    public void Info(string message)
    {
        _logger.Info(message);
    }
}

Это работает нормально, но проблема в том, что если я хочу записать текущий класс и имя метода (используя%class - %M), это всегда возвращает Log4NetLoggerService как класс и как метод, который он возвращает Info как метод.

Мне нужно получить тип родительского класса, который вызвал метод регистрации.

Могу ли я как-то внедрить тип класса, который вызывает методы журнала, когда я создаю ILoggerService пример?

2 ответа

Посмотрите на исходный код log4net; в частности, как они реализовали интерфейс ILog. По сути, вы не можете использовать интерфейс ILog в своей оболочке, вместо этого вы используете внутренний регистратор, который принимает параметр, который указывает log4net, где искать правильный класс / метод в стеке вызовов. Смотрите также этот ответ.

По моему опыту, если вам нужно имя класса, в который вы входите, вы, вероятно, регистрируете слишком много и слишком много мест в вашем приложении. Это может привести к проблемам с техническим обслуживанием. Посмотрите на этот ответ Stackru, чтобы убедиться, что вы не слишком много регистрируетесь и не нарушаете принципы SOLID.

Другие вопросы по тегам