为日志行添加前缀 log4net

Add prefix for logs lines log4net

我有 class 写日志的地方,我用的是 log4net:

class MyClass
    {
        private readonly ILog _logger = LogManager.GetLogger(typeof(MyClass));

        public void Work(int i)
        {
            _logger.Info($"{i} start");
            _logger.Info($"{i} work");
            _logger.Info($"{i} finished");
        }
    }

日志有效。但是如何更改这段代码,在写入日志块之前设置的前缀 "{i}" 而不需要每次写入日志时都添加?像这样的东西:

using(_logs.Startprefix("{i}"))
{
  _logger.Info("start");
  _logger.Info("work");
  _logger.Info("finished");
}

因为文件中的结果将被写入每一行{i}

您想做的不是 log4net 的内置功能。您需要围绕 log4net 逻辑编写一个包装器来添加此功能。类似这样,但这是草稿,您需要修改并完成它。

class MyLogger
{
  private readonly string _prefix;
  private readonly ILog _logger = LogManager.GetLogger(typeof(MyClass));

  public MyLogger(string prefix)
  {
    _prefix = prefix;
  }

  public void Info(string info)
  {
    _logger.Info($"{_prefix} {info}");
  }
}

最简单的部分是使用这样的新方法和前缀 属性:

class MyClass
{
    private readonly ILog _logger = LogManager.GetLogger(typeof(MyClass));

    public int Prefix {get;set;}

    public void Work()
    {
        PrintLine("start");
        PrintLine("work");
        PrintLine("finished");
    }

    private void PrintLine(string txt) {
        _logger.Info(Prefix + " " + txt);
    }

}

制作您自己的封装 ILog 的记录器并在那里实现 Prefix 成员。

    class MyLogger 
    {
        private readonly ILog _logger;
        public int? Prefix;

        public MyLogger(Type t)
        {
            _logger = NLog.LogManager.GetLogger(t.Name);
        }

        public void Info(string message)
        {
            _logger.Info($"{Prefix?.ToString() ?? ""} {message}");
        }

    }

那么你可以使用using语句:

using (myLogger.Prefix = i)
{
  myLogger.Info("start");
  myLogger.Info("work");
  myLogger.Info("finished");
}

我找到了这个案例的标准。 LogicalThreadContext for log4net,我的问题是这样解决的:

using (LogicalThreadContext.Stacks["NDC"].Push($"{i}"))
{
  _logger.Info("start");
  _logger.Info("work");
  _logger.Info("finished");
}