2

c#コンソールアプリでlog4netを使用していますが、各ログエントリに最後のログエントリからの経過時間を含めることができるかどうか疑問に思っていました。

現在、使用して%-4timestampいるので(ログの開始からのミリ秒であると思います)、後でログをスピンして、エントリと前のエントリの差を計算できます。ただし、各ログメッセージに経過時間を表示するために使用できるものがあることを期待していました。

これは可能ですか?

前もって感謝します!

編集 経過時間を明確にするために、log4netが最後にメッセージをログに記録してから経過した時間を意味します。

たとえば、このログがある場合:

0    [main] INFO  MyApp  - Entering application.
36   [main] DEBUG Com.Foo.Bar  - Did it again!
51   [main] INFO  MyApp  - Exiting application.

次に、私が欲しい追加情報は次のようになります。

0   (0)  [main] INFO  MyApp  - Entering application.
36  (36) [main] DEBUG Com.Foo.Bar  - Did it again!
51  (15) [main] INFO  MyApp  - Exiting application.

ここで、括弧の間に追加した値は、最後のログからの経過時間です。

4

2 に答える 2

3

私はこれが古いことを知っています、しかし私はちょうど同じものを探していて、ロガーを包むのが嫌いでした。私ははるかに良い方法は:を使用することだと思いPatternConverterます

class DeltaPatternConverter : PatternLayoutConverter
{
    private DateTime _last = DateTime.MinValue;

    protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    {
        DateTime now = DateTime.Now;
        int ms = 0;
        if (_last != DateTime.MinValue)
        {
            ms = (int)Math.Round((now - _last).TotalMilliseconds, 0, MidpointRounding.ToEven);
        }
        writer.Write("+" + ms);
        _last = now;
    }
}

次のように使用します。

var layout = new PatternLayout("%7timestampms (%7deltams) [%thread] %-5level %logger - %message%newline");
layout.AddConverter("delta", typeof(DeltaPatternConverter));
layout.ActivateOptions();

またはこのように:

<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <converter>
        <name value="delta"></name>
        <type value="My.Cool.Project.DeltaPatternConverter"></type>
      </converter>
      <conversionPattern value="%7timestampms (%7deltams) [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="INFO" />
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

文字列デルタが変換されます。

于 2014-12-17T15:00:49.540 に答える
2

それを追跡して自分で追加してみませんか?

何かのようなもの:

public static class LoggingWrapper
    {
        private static ILog logger;
        private DateTime timeOfLastLog;

        static LoggingWrapper()
        {
            logger = LogManager.GetLogger(typeof(Program));
            logger.Info("Logger initialized");
            timeOfLastLog = DateTime.Now;
        }

        public static void Debug(string Message)
        {
            logger = LogManager.GetLogger("YourDebugLoggerName");
            TimeSpan differential = DateTime.Now - timeOfLastLog();
            logger.Debug(Message + "-----" + differential.ToString());
        }
    }

もちろん、少しカスタマイズしたいのですが、これが基本的な考え方です。カスタマイズ機能が追加されているという理由だけで、私は常にラッパークラスを使用してロギングを行います。たとえば、次のようなカスタム例外ロギングを行うために使用します。

public static void LogException(Exception ex)
{
    logger = LogManager.GetLogger("NHibernate.SQL");
    logger.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace, ex);
}

そうすれば、例外の詳細をログに記録したいときに、次のようなことができます。

try
{
    ThrowAnException();
}
catch(Exception ex)
{
    LoggingWrapper.LogException(ex);
}

それ以外の:

try
{
    ThrowAnException();
}
catch(Exception ex)
{
    LoggingWrapper.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace);
}

そして、それはほんの一例です。これを便利にするものは他にもたくさんあります。

于 2012-07-18T14:51:13.797 に答える