为日志行添加前缀 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");
}
我有 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");
}