自Log4Net中的上一条消息以来的输出已用时间

时间:2012-07-18 14:41:51

标签: c# log4net

我在c#console app中使用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.

我在括号中添加的额外值是自上次记录以来经过的时间。

2 个答案:

答案 0 :(得分: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>

将转换String delta

答案 1 :(得分: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);
}

这只是一个例子。还有很多其他的东西可以使它变得有用。