аргумент log4net для LogManager.GetLogger
почему большинство примеров log4net получают регистратор для класса, делая это:
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
вместо того, чтобы просто передавать typeof (MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
есть ли другая причина для этого, кроме того, что первый вариант не требует ввода определенного имени класса?
4 ответа:
Я думаю, что у тебя есть причина. Я делаю это таким образом, чтобы мне не нужно было беспокоиться о имени класса и можно было просто скопировать и вставить код котельной плиты в новый класс.
официальный ответ см. В разделе: Как получить полное имя класса в статическом блоке? на log4net faq
Как вы говорите-это удобно, поскольку вы можете создать регистратор в методе, не зная имени класса (тривиальный я знаю), но позволяет вырезать и вставлять методы между классами без необходимости переименовывать вызов.
Я пользователь NLog, и обычно это сводится к:
var _logger = LogManager.GetCurrentClassLogger();
казалось немного странным, что вам нужно пройти через отражение в Log4Net, поэтому я посмотрел в исходном коде NLog, и вот, что они делают для вас:
[MethodImpl(MethodImplOptions.NoInlining)] public static Logger GetCurrentClassLogger() { string loggerName; Type declaringType; int framesToSkip = 1; do { #if SILVERLIGHT StackFrame frame = new StackTrace().GetFrame(framesToSkip); #else StackFrame frame = new StackFrame(framesToSkip, false); #endif var method = frame.GetMethod(); declaringType = method.DeclaringType; if (declaringType == null) { loggerName = method.Name; break; } framesToSkip++; loggerName = declaringType.FullName; } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase)); return globalFactory.GetLogger(loggerName); }
Я думаю, я бы написал что-то подобное для Log4Net как расширение или статический метод вместо вставки отражения как часть моего кода котла :)