Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为日志行log4net添加前缀_C#_Log4net - Fatal编程技术网

C# 为日志行log4net添加前缀

C# 为日志行log4net添加前缀,c#,log4net,C#,Log4net,我有一个写日志的类,我使用log4net: class MyClass { private readonly ILog _logger = LogManager.GetLogger(typeof(MyClass)); public void Work(int i) { _logger.Info($"{i} start"); _logger.Info($"{i} work");

我有一个写日志的类,我使用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
压缩,并在那里实现
前缀
成员

    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 (myLogger.Prefix = i)
{
  myLogger.Info("start");
  myLogger.Info("work");
  myLogger.Info("finished");
}

我为这个案子找到了standart<代码>LogicalThreadContext
用于log4net,我的问题如下所示:

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

你可以在方法的开头再加一行显示前缀吗_logger.Info(“{i}”)?当调用log.Info、log.Warn等时,我需要在日志的每一行中使用
“{i}”
。我不想每次都写前缀。