我有一个写日志的类,我用了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}
制作你自己的记录器,封装了 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");
}
你要做的不是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);
}
}
我找到了standart这个例子 LogicalThreadContext
的log4net,我的问题就这样解决了。
using (LogicalThreadContext.Stacks["NDC"].Push($"{i}"))
{
_logger.Info("start");
_logger.Info("work");
_logger.Info("finished");
}