C# 输出自Log4Net中最后一条消息以来经过的时间
我正在c#console应用程序中使用log4net,我想知道是否可以让每个日志条目包含自上次日志条目以来经过的时间 现在,我正在使用C# 输出自Log4Net中最后一条消息以来经过的时间,c#,log4net,C#,Log4net,我正在c#console应用程序中使用log4net,我想知道是否可以让每个日志条目包含自上次日志条目以来经过的时间 现在,我正在使用%-4timestamp(我相信这是自日志开始以来的毫秒数),以便稍后可以旋转日志并计算一个条目和上一个条目之间的差异。不过,我希望有一些东西可以用来获取出现在每个日志消息中所用的时间 这可能吗 提前谢谢 编辑 为了澄清经过的时间,我指的是自log4net上次记录消息以来经过的时间量 例如,如果我有此日志: 0 [main] INFO MyApp - E
%-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.
public static void LogException(Exception ex)
{
logger = LogManager.GetLogger("NHibernate.SQL");
logger.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace, ex);
}
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>
其中,我在括号中添加的额外值是自上次日志以来经过的时间。为什么不跟踪它并自己添加呢 比如:
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());
}
}
try
{
ThrowAnException();
}
catch(Exception ex)
{
LoggingWrapper.LogException(ex);
}
显然,您需要定制一点,但这是基本的想法。我总是使用包装器类来做日志记录,只是因为它增加了定制功能。例如,我使用它进行自定义异常日志记录,如下所示:
0 (0) [main] INFO MyApp - Entering application.
36 (36) [main] DEBUG Com.Foo.Bar - Did it again!
51 (15) [main] INFO MyApp - Exiting application.
public static void LogException(Exception ex)
{
logger = LogManager.GetLogger("NHibernate.SQL");
logger.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace, ex);
}
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>
这样,当我想记录异常详细信息时,我可以执行以下操作:
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());
}
}
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);
}
这只是一个例子。还有很多其他的东西使这个有用。我知道这个很旧,但我只是在寻找同样的东西,不喜欢包装这个记录器。我认为更好的方法是使用
模式转换器
:
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;
}
}
像这样使用它:
0 (0) [main] INFO MyApp - Entering application.
36 (36) [main] DEBUG Com.Foo.Bar - Did it again!
51 (15) [main] INFO MyApp - Exiting application.
public static void LogException(Exception ex)
{
logger = LogManager.GetLogger("NHibernate.SQL");
logger.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace, ex);
}
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>
或者像这样:
0 (0) [main] INFO MyApp - Entering application.
36 (36) [main] DEBUG Com.Foo.Bar - Did it again!
51 (15) [main] INFO MyApp - Exiting application.
public static void LogException(Exception ex)
{
logger = LogManager.GetLogger("NHibernate.SQL");
logger.Error(ex.Message + Environment.NewLine + ex.InnerException + Environment.NewLine + ex.StackTrace, ex);
}
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>
字符串增量将被转换。您所说的已用时间是什么意思?您是指两个不同日志事件之间的已用时间,还是指记录特定事件所花费的时间?我是指自log4net上次记录消息以来的已用时间。我将更新我的问题以反映这一点。好的,为什么需要这个(当您可以有日志记录时间历史时,您可以在日志解析器中使用它)。我在开发过程中使用它来查找慢点。你说的日志解析器是什么意思?我目前有一个快速的Perl命令行来查找差异,但是是否有其他工具来实现这一点?我更希望在开发过程中直接在日志中记录这个数字。所谓解析器,我指的是类似于您自己的perl命令,但我认为log4net中没有这样的功能,但您可以将其写入消息文本中。我的意思是,在发送消息进行日志记录之前,在消息开头添加额外的文本来处理这个问题(应该有一个变量来跟踪日志记录时间),您也可以使用自定义日志文件appender来处理它。如果log4net不能以本机方式处理此问题,那么我认为这是最好的选择。非常感谢!@BrianH不客气!即使它以本机方式处理此问题(我怀疑它能,但谁知道呢),我认为这仍然是您想要的方式。通过这种方式,您还可以添加自定义日志记录方法。稍后,我将用几个示例编辑这篇文章,以向您展示。