Log4Net 中 AdoNetAppender 中的缓冲区的惰性评估

2024-03-22

我正在使用 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(使用前将#替换为@)

Log4Net 中 AdoNetAppender 中的缓冲区的惰性评估 的相关文章

随机推荐

  • .htaccess:此处不允许使用 RewriteEngine

    我将 htaccess 上传到服务器并收到错误 500 内部服务器错误 在错误日志中我有以下错误 htaccess 此处不允许 RewriteEngine But mod rewrite so已启用 那么我需要改变吗
  • Android Textview斜体和wrap_contents

    我正在使用 3 个不同颜色的斜体文本视图
  • 将 Jar 文件与 -classpath JAVA 组合

    我有一个关于编译一个 Jar 文件中有一些依赖类的类的问题 MyJar jar 通过将目录树放入 classpath 选项中 例如 javac cp MyJar MyClass java 是检查所有子目录中的类还是仅检查目录树中的顶级类 提
  • 字节的二进制读取仅返回一个值。 C#

    当我期望 0 1 2 3 时 控制台显示 0 0 0 0 这是以下版本的修改版本 https msdn microsoft com en us library system io binarywriter v vs 110 aspx htt
  • 如何将 QTextTable 中的文本居中

    我正在使用 qt 框架开发应用程序 现在我想将表格数据保存为 pdf 我正在使用 QTextTable 和 QTextDocument 类 但是我无法将单元格中的文本居中 我该怎么做呢 感谢帮助 如果您想在插入文本时进行对齐 可以使用 Al
  • 将 JSON 反序列化为匿名对象

    在 C 中 我通过使用这样的代码成功地将匿名对象序列化为 JSON var obj new Amount 108 Message Hello JavaScriptSerializer serializer new JavaScriptSer
  • Asp.Net MVC - 具有两个相同类型列表的强类型视图

    我有一个强类型化到 Item 类的视图 在我的控制器中 我需要发送两个不同的列表 除了创建一个带有两个 List 的新类之外 还有更简单的方法可以做到这一点吗 我最终想要做的是在我的主页上有 10 个按日期排序的项目 以及 10 个按人气排
  • ReactJS 如何添加显示更多/显示更少按钮

    我是 React 新手 我想向我的应用程序添加一个简单的 显示更多 按钮 我有一个包含数据的数组 我想在其中默认显示 3 个条目 当用户点击show more 应呈现其余数据 并且按钮应将文本更改为show less 我不太确定该怎么做 这
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • 检查数组是否包含重复值[重复]

    这个问题在这里已经有答案了 我想编写一个 JavaScript 函数来检查数组是否包含重复值 我编写了以下代码 但其给出的答案始终为 true 谁能告诉我我错过了什么 function checkIfArrayIsUnique myArra
  • 如何在 Docker 容器(Python、Flask 和 Redis)中启动自定义 RQ Worker

    我遵循 Miguel Grinberg 的优秀 Flask Mega 教程 成功设置了一个包含 Redis 任务队列和 RQ 工作线程的 Flask Web 应用程序 所有这些都在 Docker 容器中 为了提高任务队列性能 我现在需要使用
  • 如何在flutter中解析复杂的json

    我无法从复杂的 json 中获取数据 下面是请求中的 json results TotalRecordCount 1 Records code PCK 34333338365C93E2D50DB9C address 1 AV KHEIRED
  • Python 中的 Codewars Scramblies [重复]

    这个问题在这里已经有答案了 这是对代码战争臭名昭著的参考争夺 https www codewars com kata 55c04b4cc56a697bb0000048 train python我无法理解为什么我的简单代码性能缓慢 根据 co
  • 在 Java 中初始化复杂静态成员的最佳方法是什么?

    我的目标是拥有一个私人静态Properties我的类中的对象 在创建其他对象时充当默认值Properties我的应用程序所需的对象 当前的实现如下所示 public class MyClass private static Properti
  • 如何从UTF-8字符串的每个字符中获取UNICODE代码?

    使用 C 11 我如何从 UTF 8 编码std string 将文本每个字符的Unicode值放入一个uint32 t 就像是 void f const std string utf8 str for uint32 t code Do m
  • Facebook:图形 API 回调 / 实时 API / 公共 Feed API

    我正在开发一个社交媒体项目 我需要关注一些粉丝专页并收听该特定页面上发生的所有事情 我确实知道有一些数据经销商 例如GNIP http gnip com Datasift http datasift com 谁能给我提供这样的数据 我已经尝
  • OpenShift 自定义盒和 NPM

    我正在与一个社区开发的 OpenShift 卡带 https github com gsterjov openshift nginx cartridge对于 nginx 墨盒的构建脚本 无需任何修改 运行良好 它使用我提供的配置文件启动 n
  • Mobile Safari 点击事件“详细信息”属性始终为 1

    UIEvent detail https developer mozilla org en US docs Web API UIEvent detail属性应包含当前的点击计数 MDN 网络文档tells https developer m
  • WCF 服务是否使用多个线程来处理传入请求?

    如何确保 WCF 服务使用 ThreadPool 中的线程来处理传入消息 目前简单的方法调用如 return null 处理另一个请求时大约需要 45 秒 以下是我注释服务类别的方式 ServiceBehavior ConcurrencyM
  • Log4Net 中 AdoNetAppender 中的缓冲区的惰性评估

    我正在使用 Log4Net 自定义属性将一些环境信息添加到我的日志中 我创建了一个具有全局可访问属性的实用程序类 我的程序类使用它来存储上下文信息 订单 id 用户 id 等 以及围绕它们的惰性包装器 因此我不需要一直更改 Log4Net