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

问题描述 投票:2回答:2

我在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.

我在括号之间添加的额外值是自上次日志以来经过的时间。

c# log4net
2个回答
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);
}

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


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>

字符串增量将被转换。

© www.soinside.com 2019 - 2024. All rights reserved.