将程序开始时间附加到每个日志行

时间:2018-05-03 15:45:08

标签: c# log4net

我在C#中有一个程序,并使用 log4net 库进行日志记录。

我正在尝试在整个程序的每行日志中记录程序开始时间:

class MyProgram
{
    static DateTime startTime;
    static void Main()
    {
        startTime = DateTime.Now;
        Log.Info(startTime + "Program started");

        MyMethod1();
        //...
    }

    static void MyMethod1()
    {
        Log.Info(startTime + "method1 step1 ");
        //code
        Log.Info(startTime + "method1 step2");
    }    
}

log4net configuaration

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\Logs\\Job.json" />

      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maximumFileSize value="20MB" />
      <maxSizeRollBackups value="10" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
        <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
        <member value="startTime:%property{ApplicationStartTime}"/>
        <member value="date:date" />
        <member value="level:level" />
        <member value="logger:logger" />
        <member value="message:messageObject" />
        <member value="exception:exception" />
      </layout>     
    </appender>

我可以配置 log4net 以自动将程序的开始时间添加到每个日志行,而不是手动将其附加到每一行吗?

2 个答案:

答案 0 :(得分:5)

您可以使用log4net.GlobalContext设置全局属性。像这样:

   static void Main()
    {
        log4net.GlobalContext.Properties["ApplicationStartTime"] = DateTime.Now;
    (...)

然后在日志配置中像这样访问它

%property{ApplicationStartTime}

Here还有一些阅读,here是一个类似的问题。

对于log4net.Ext.Json,您可以这种方式引用自定义属性:

<!-- json property named after custom property -->
<member value="ApplicationStartTime"/> 
<!-- json property with explicit name -->
<member value="startTime:ApplicationStartTime"/>

答案 1 :(得分:4)

围绕log4net日志方法创建一个方法包装器,该方法接收一条消息并将其转发到log4net日志方法,但为您预先添加startTime

var startTime = DateTime.Now.ToString();

void Log(string message)
{
  Log.Info($"{startTime}: {message}");
}

或者,您可以创建扩展方法:

public static class LoggerExtensions
{
    public static void LogWithStartTime(this Logger self, string message)
    {
        var startTime = Global.GetStartTime();

        self.Log($"{startTime}: ${message}");
    }
}