为日志行添加前缀 log4net。

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

我有一个写日志的类,我用了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");
        }
    }

logs工作。但是,如何改变这段代码,前缀是什么?"{i}" 在写日志块之前设置,不需要在每次写日志时添加?类似这样。

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

结果文件中的每一行都会被写进去。{i}

c# log4net
2个回答
1
投票

制作你自己的记录器,封装了 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");
}

0
投票

你要做的不是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}");
  }
}

0
投票

最简单的部分是使用一个新的方法,像这样的方法和你的前缀的属性。

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);
    }

}

0
投票

我找到了standart这个例子 LogicalThreadContext 的log4net,我的问题就这样解决了。

using (LogicalThreadContext.Stacks["NDC"].Push($"{i}"))
{
  _logger.Info("start");
  _logger.Info("work");
  _logger.Info("finished");
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.