Использование 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.