gpt4 book ai didi

c# - 在 Log4Net 的 AdoNetAppender 中使用缓冲区进行延迟评估

转载 作者:行者123 更新时间:2023-11-30 20:46:40 26 4
gpt4 key购买 nike

我正在使用 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 时工作得很好。但是,当我有 buffer > 1 时,Log4Net 会推迟对属性的评估,直到缓冲区在应用程序结束时被刷新或者当 buffer 中的条目 > bufferSize 时。。 p>

发生这种情况时,信息不再位于全局属性中,或者它的值已更改(如循环处理订单),因此我在日志中得到错误值或空值。

我能看到解决此问题的唯一选择是停止使用缓冲区,以便在刷新条目时在所有调用中评估属性值。由于 ThreadContext 中的属性仅在刷新缓冲区时才被评估,恐怕我不能为每个日志调用设置不同的属性值。

有什么方法可以让 Log4Net 在缓冲条目而不是刷新条目时评估 ThreadContext(或它具有的其他上下文)?

谢谢

最佳答案

默认情况下,log4net 不会 fix缓冲附加程序的日志时间上下文中的属性提供程序值。它们在缓冲区刷新时得到评估。

要解决此问题,您必须从 log4net.Core 命名空间实现 IFixingRequired。

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

(用我自己的property provider测试,由于我自己的需要依赖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();
}
}

总体思路来自piers blog .看这个my other answer另一个问题如果您想了解有关此 HttpContextValueProvider 的更多最新详细信息。)

关于c# - 在 Log4Net 的 AdoNetAppender 中使用缓冲区进行延迟评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26587190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com