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

我知道这很旧,但我只是在寻找相同的东西并且不喜欢包装记录器。我认为更好的方法是使用 a 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 回答