При использовании оболочки, как сохранить имя класса и метода для Log4Net для входа? - PullRequest
7 голосов
/ 12 января 2010

Мне нужна оболочка Log4net - чтобы ее можно было использовать в разных приложениях. Я, очевидно, хочу сохранить имя класса и метода при ведении журнала, но я бы не стал передавать тип и т. Д. Своей оболочке.

Я посмотрел на этот вопрос , который очень похож на мой, но это не помогло.

Я видел, как это было сделано в этот другой вопрос с smt вроде следующего:

MethodBase methodBase = new StackTrace().GetFrame(1).GetMethod();
this.log.Debug(methodBase.Name + " : " + message);

Это не идеально, так как он не использует готовые функциональные возможности Log4Net.

Я хотел бы получить представление о том, как люди делают это, прежде чем я пойду по касательной и придумаю что-то очень сложное. Любые указатели (ссылки / ресурсы / образцы) приветствуются!

Ответы [ 3 ]

4 голосов
/ 10 августа 2010

Log4net позволяет вам получить доступ к имени метода, например, как этот метод%. Это не самая быстрая операция, но если вам нужно что-то отладить, вы вполне можете ее использовать. Я полагаю, что ваш вопрос касается того факта, что 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);

Очевидно, что кое-что еще предстоит сделать, но упомянуты важные моменты.

3 голосов
/ 04 февраля 2017

Создайте свой класс-оболочку следующим образом ...

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
2 голосов
/ 15 января 2010

Я обычно добавляю что-то такое ... (это все необходимые мне функции)

MethodBase.GetCurrentMethod().Name

Вы всегда можете создать оболочку для Log4Net, которая принимает любые необходимые вам параметры (например, MethodBase)?

...