多线程安全日志记录

2023-11-21

我们有一个在多个线程中运行并使用 Log4Net 作为日志记录框架的应用程序。我们遇到了一些日志事件未记录的情况。正如文档中提到的,文件附加器其他 Appender 是“not对于多线程操作是安全的”。 我在网上搜索解决方案或 Appenders,但找不到。
您知道使用环形缓冲区或队列来提供多线程支持的多线程安全 Log4Net Appender 吗?或者我们应该使用不同的多线程安全日志框架吗?
提前致谢!


我编写了一些单元测试来重现该问题:一个测试创建 50 个线程,每个线程记录 500 条消息。然后对写入的行进行计数,结果我得到了 25,000 (50 x 500) 行不同顺序的行。我在双核和八核机器上测试了它。
我测试了静态记录器:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger");

并为测试类/线程的每个实例提供一个记录器:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString());


所有测试都是绿色的。

所以Log4Net工作得很好并且能够很好地处理多线程场景。 Appender 文档应该更新,并声明如果以正确的方式使用 Logger API,则支持多线程操作。

我猜想我们在客户计算机上遇到的丢失日志条目的问题是由其他问题引起的。也许底层虚拟机或硬件已损坏。

感谢您的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程安全日志记录 的相关文章

随机推荐

  • 为什么 println!内联变量语法看起来不一致?

    let a 10 20 30 40 50 let mut index 0 while index lt 5 println a index works println a index does not work println index
  • 带有内存数据库的 Rails

    我可以设置rails使用mysql和MEMORY作为数据库引擎吗 我从不重新启动 mysql 并且经常重建数据库 我宁愿让它很快 拥有用于运行测试的内存数据库也很好 编辑 我应该指定这仅用于开发 测试 而不是生产 我不明白你为什么不能 您选
  • MySQL 连接:全局连接还是对象内连接?

    我有两个 PHP 课程 一种是用于连接到数据库 构建查询 执行查询以及与数据库断开连接 另一个类是针对用户的 添加用户 更新用户 登录用户等 我正在争论是否应该全局连接到页面上的数据库并使用该连接 将数据库对象传递到用户对象的方法中 或者是
  • Firefox 中的 Rails csrf 验证

    我有一个使用 Rails 创建的站点 使用 Devise 进行身份验证 它在 Chrome 中工作得很好 但在 Firefox 中我无法登录 我只能看到日志中的一条消息 WARNING Can t verify CSRF token aut
  • Jenkins 管道中触发器指令的条件

    Jenkins 已经不错了 比较全面文档关于 Jenkinsfile 语法 但我仍然没有找到答案是否可以在管道的顶层进行流量控制 从字面上包括一些东西if就在pipeline 部分 声明性 如 pipeline if bla foo tri
  • Solidity - 无效的 BigNumber 字符串(参数 =“value”值 =“”代码 = INVALID_ARGUMENT 版本 = bignumber/5.4.2)

    这里是坚固性新手 当我尝试读取 people 数组的值时 我收到错误 调用 SimpleStorage people 出错 编码参数时出错 错误 无效的 BigNumber 字符串 参数 值 值 代码 INVALID ARGUMENT 版本
  • Java 中整数到 BinaryString 删除前导零

    我想将整数转换为二进制字符串 我选择使用java允许的本机函数Integer toBinaryString n 但不幸的是 这会从我的输出中删除前导零 举例来说 我将输入指定为18 它给了我输出10010但实际输出应该是010010 有没有
  • 捕获 Android 应用程序何时进入后台

    我需要有关 Android 的帮助 这是我需要在应用程序进入后台时捕获事件的问题 例如 按下主页或将我的应用程序推入后台的任何其他操作 目前我可以抓住 onPause 进行活动 Override protected void onPause
  • jquery 中的可滚动、轮播、滑块,无需任何插件 - 最简单的方法

    我正在寻找有关带有循环动画的 jQuery 滑块 如可滚动插件 的教程 无需任何插件 最简单的方法 教程 更新日期 2014 年 8 月 27 日 DEMO http so lucafilosofi com scrollable carou
  • 使用 HtmlAgilityPack 设置 InnerText

    我尝试使用以下方法设置 InnerText 但不允许设置 InnerText 属性 node InnerText node InnerText Remove 100 原因是我只想删除文本 而不是实际元素 div Lorem ipsum do
  • 有没有办法将自然语言日期 NSString 转换为 NSDate

    假设我有 NSString tomorrow 是否有任何库可以接受这样的字符串并将它们转换为 NSDates 我想象 希望有这样的事情 NSString humanDate tomorrow at 4 15 NSDateFormatter
  • Javascript window.open 在 Win7 x64 上的 32 位 IE8 中返回 null

    我已阅读有关此主题的相关问题 但尚未找到此问题的解决方案 我有一个简单的 javascript 函数 在单击链接时调用 window open var newwindow function pop url newwindow window
  • 低级鼠标挂钩和 DirectX

    我正在构建一个需要在系统范围内过滤一些鼠标点击的应用程序 也就是说 我需要让系统在特殊场合忽略一些鼠标按钮的点击 我使用低级鼠标钩SetWindowsHookEx过滤掉这些点击 它的效果相对较好 除了WPF应用程序 我想这是因为这些应用程序
  • grid.Call(L_textBounds, as.graphicsAnnot(x$label), x$x, x$y, 中的错误:找不到多边形边缘

    我刚刚在 Mac OS X 版本 10 7 3 上安装了 RStudio 执行以下命令后 library ggplot2 qplot mpg wt data mtcars 我收到以下错误 Error in grid Call L textB
  • 如何在特定目录中安装 Bower 依赖项?

    我正在为简单的网站构建一个自耕农生成器 我想在我的脚手架中包含一个流行的 JavaScript 库 这很容易bower install
  • 在复杂对象图上使用 IXmlSerialized 接口

    如果使用自定义 XML 序列化 IXmlSerialiable 在一个复杂对象上 该对象包含具有组成复杂对象的属性 这些属性NOT使用自定义IXmlSerializable接口 你如何指定 在IXmlSerializable ReadXml
  • IBOutletCollection 的实际高效使用

    IBOutletCollection的实际用法看起来怎么样 不幸的是 苹果文档简单地提到了它 但没有给出更广泛的用法 好的 它与IB保持了一对多的关系 但是如何高效地访问和使用特定的对象呢 与标签名 如何保证对象的顺序 我最近使用它来轻松初
  • 如何将日期和时间从自然语言翻译为日期时间? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一种方法将 明天早上 6 点 或 下周一中午 翻译为适当的日期时间对象 我想过设计一套复杂的规则 但还有其他方法吗 解析日期时间 能够解析
  • 如何在 Java 中将文件读取为无符号字节?

    如何在 Java 中将文件读取为字节 需要注意的是 所有字节都必须为正数 即不能使用负数范围 这可以在 Java 中完成吗 如果可以 怎么做 我需要能够将文件的内容乘以一个常量 我假设我可以将字节读入 BigInteger 然后相乘 但是由
  • 多线程安全日志记录

    我们有一个在多个线程中运行并使用 Log4Net 作为日志记录框架的应用程序 我们遇到了一些日志事件未记录的情况 正如文档中提到的 文件附加器其他 Appender 是 not对于多线程操作是安全的 我在网上搜索解决方案或 Appender