我正在使用 Log4Net 自定义属性将一些环境信息添加到我的日志中。我创建了一个具有全局可访问属性的实用程序类,我的程序类使用它来存储上下文信息(订单 id、用户 id 等)以及围绕它们的惰性包装器,因此我不需要一直更改 Log4Net ThreadContext。像这样的东西:
public class LoggerPropertyProvider
{
private readonly string _value;
public LoggerPropertyProvider(string value)
{
_value = value;
}
public override string ToString()
{
return _value;
}
}
无论我想将什么值作为属性公开给 Log4Net,我都只需使用它进行注册惰性评估在应用程序开始时。
ThreadContext.Properties["ORDER_ID"] = new LoggerPropertyProvider(ContextInformation.OrderId);
它工作得很好无缓冲区附加器(例如滚动文件)或在 AdoNetAppender 中将缓冲区设置为 0 时。然而,当我有缓冲区 > 1Log4Net 推迟对属性的评估,直到应用程序结束时或刷新缓冲区时缓冲区中的条目 > bufferSize.
当发生这种情况时,信息不再位于全局属性中,或者它的值已更改(如循环处理订单),因此我在日志中得到错误或空值。
我能看到解决此问题的唯一选择是停止使用缓冲区,以便在刷新条目时在所有调用中评估属性值。由于仅在刷新缓冲区时才会评估 ThreadContext 中的属性,因此恐怕每个日志调用都无法具有不同的属性值。
有什么方法可以让 Log4Net 在缓冲条目时而不是在刷新条目时评估 ThreadContext (或它具有的其他上下文)?
Thanks
默认情况下,log4net 不fix https://logging.apache.org/log4net/release/sdk/html/T_log4net_Core_IFixingRequired.htm缓冲附加程序的日志时间上下文中的属性提供程序值。它们在缓冲区刷新时进行评估。
要解决此问题,您必须从 log4net.Core 命名空间实现 IFixinRequired。
public class LoggerPropertyProvider : IFixingRequired
{
private readonly string _value;
public LoggerPropertyProvider(string value)
{
_value = value;
}
public override string ToString()
{
return _value;
}
object IFixingRequired.GetFixedObject()
{
return ToString();
}
}
(使用我自己的属性提供程序进行测试,由于我自己的需要,它依赖于 http 上下文:
// We can not use log4net ThreadContext or LogicalThreadContext with asp.net, since
// asp.net may switch thread while serving a request, and reset the call context in
// the process.
public class HttpContextValueProvider : IFixingRequired
{
private string _contextKey;
public HttpContextValueProvider(string contextKey)
{
_contextKey = contextKey;
}
public override string ToString()
{
var currContext = HttpContext.Current;
if (currContext == null)
return null;
var value = currContext.Items[_contextKey];
if (value == null)
return null;
return value.ToString();
}
object IFixingRequired.GetFixedObject()
{
return ToString();
}
}
一般想法来自码头博客 http://piers7.blogspot.fr/2005/12/log4net-context-problems-with-aspnet.html。看到这个我的另一个答案 https://stackoverflow.com/a/23908099/1178314另一个问题
如果您想了解更多有关此内容的最新详细信息HttpContextValueProvider
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)