При использовании оболочки, как сохранить имя класса и метода для Log4Net для входа?
Мне нужна оболочка Log4net, чтобы в большом приложении можно было использовать несколько различных компонентов. Я, очевидно, хочу сохранить имя класса и метода при ведении журнала, но я бы не стал передавать тип и т. Д. Своей оболочке.
Я посмотрел на этот вопрос, который очень похож на мой, но это не помогло.
Я видел, как это было сделано в этом другом вопросе с smt, как показано ниже:
MethodBase methodBase = new StackTrace().GetFrame(1).GetMethod();
this.log.Debug(methodBase.Name + " : " + message);
Это не идеально, так как он не использует готовую функциональность Log4Net.
Я хотел бы получить представление о том, как люди делают это, прежде чем я пойду по касательной и придумаю что-то очень сложное. Любые указатели (ссылки / ресурсы / образцы) приветствуются!
3 ответа
Я обычно добавляю что-то такое... (это все, что мне нужно)
MethodBase.GetCurrentMethod().Name
Вы всегда можете создать обертку для Log4Net, которая принимает любые необходимые вам параметры (например, MethodBase)?
Log4net позволяет вам получить доступ к имени метода, например, как этот метод%. Это не самая быстрая операция, но если вам нужно что-то отладить, вы вполне можете ее использовать. Я полагаю, что ваш вопрос касается того факта, что log4net не выведет правильное имя метода, если вы используете оболочку.
Чтобы решить эту проблему, вы должны посмотреть, как log4net написал ILog
реализация. Это в основном оболочка для внутреннего Log4net Logger и, следовательно, та же проблема относится к 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);
Очевидно, что есть кое-что еще сделать, но упоминаются важные моменты.
Создайте свой класс-обёртку вот так...
public static class LogFourNet
{
// Define a static logger variable so that it references the
private static readonly ILog Log = LogManager.GetLogger(typeof(LogFourNet));
static LogFourNet()
{
XmlConfigurator.Configure(
new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
Log.Info("Log4net is configured.");
}
public static void Info(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0,
[CallerFilePath] string caller = "", [CallerMemberName] string memberName = "")
{
Log.Info("[" + currentObj.GetType().Namespace + "." +
Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg);
}
public static void Debug(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0,
[CallerFilePath] string caller = "", [CallerMemberName] string memberName = "")
{
Log.Debug("[" + currentObj.GetType().Namespace + "." +
Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg);
}
public static void Error(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0,
[CallerFilePath] string caller = "", [CallerMemberName] string memberName = "")
{
Log.Error("[" + currentObj.GetType().Namespace + "." +
Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg);
}
}
Настройте файл log4net.config следующим образом...
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<root>
<!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<level value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
Теперь просто используйте выше эти методы, как это...
// need to pass this(current obj) as we want to log full class name
LogFourNet.Debug(this, "started something from wrapper");
output:
-------
2017-02-04 15:38:37,549 [1] DEBUG [WebAPI_DI.Startup.Configuration:25] - started something from wrapper