Мне нужна обертка Log4net - чтобы быть выставленным многим различным компонентам в крупном приложении. Я, очевидно, хочу сохранить имя класса и имя метода при входе, но я держался бы отдельно передачи типа и т.д. к моей обертке.
Я взглянул на этот вопрос, который очень похож на мой, но он не помог.
Я видел сделанный в этом другом вопросе с smt как следующее:
MethodBase methodBase = new StackTrace().GetFrame(1).GetMethod();
this.log.Debug(methodBase.Name + " : " + message);
Это не идеально, так как это не использует функциональность out-of-the-box Log4Net.
Я хотел бы понять то, как люди делают это, прежде чем я пойду для касательной и придумаю что-то очень сложное. Любые указатели (ссылки/ресурсы/образцы) ценятся!
Я обычно добавляю что-нибудь такое ...(это вся необходимая мне функциональность)
MethodBase.GetCurrentMethod().Name
вы всегда можете создать оболочку для Log4Net, которая принимает любые необходимые вам параметры (например, MethodBase)?
Log4net позволяет вам получить доступ к имени метода, например, как этот% method. Это не самая быстрая операция, но если вам нужно что-то отладить, вы вполне можете ее использовать. Я считаю, что ваш вопрос касается того факта, что log4net не будет выводить правильное имя метода, если вы используете оболочку.
Чтобы решить эту проблему, вы должны посмотреть, как log4net написал реализацию ILog
. По сути, это оболочка для внутреннего регистратора log4net, и поэтому та же проблема относится и к реализации ILog
. Я сделал в основном следующее:
// define a field such as this
private static readonly Type ThisDeclaringType = typeof(MyLogWrapper);
// in constructor. Note: I use the internal Logger!
this.Logger = LogManager.GetLogger(name).Logger;
// I created a WriteLog method that calls the internal logger like this
// you will need to translate to the internal log levels
// message and ex are the items I want to log (ex can be null)
this.Logger.Log(MyLogWrapper.ThisDeclaringType, log4netLevel, message, ex);
Очевидно, что еще есть над чем поработать, но важные моменты отмечены.