- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
TickZoom 是一个非常高性能的应用程序,它使用自己的并行化库和多个 O/S 线程来平滑地利用多核计算机。
该应用遇到瓶颈,用户需要从单独的 O/S 线程将信息写入 LogAppender。
FileAppender 使用 MinimalLock 特性,这样每个线程都可以锁定并写入文件,然后释放它以供下一个线程写入。
如果 MinimalLock 被禁用,log4net 会报告有关文件已被另一个进程(线程)锁定的错误。
log4net 执行此操作的更好方法是让一个线程负责写入 FileAppender,而任何其他线程只需将它们的消息添加到队列中即可。
通过这种方式,可以禁用 MinimalLock 以大大提高日志记录的性能。
此外,该应用程序会执行大量 CPU 密集型工作,因此使用单独的线程写入文件也会提高性能,这样 CPU 就不会等待 I/O 完成。
那么问题来了,log4net已经提供这个功能了吗?如果是这样,您如何启用线程写入文件?也许还有另一个更高级的附加程序?
如果不是,那么由于 log4net 已经包含在平台中,因此可以在 TickZoom 代码中为此目的实现单独的线程和队列。
真诚的,韦恩
编辑:
谢谢,答案似乎指向开发我们自己的解决方案,作为 log4net 的某种扩展。他们清楚地表明 log4net 不会做这种事情。
此外,我们刚刚意识到我们可能正在“滥用”日志系统,该系统主要用于人类可读的消息,用于通知重要事件或调试信息。软件输出的这一特定部分仅真正用于验证系统准确性的自动化工具。
当然,我们也以“正常”方式使用 log4net 进行调试、警告等。
但与调试或用户通知日志相比,这些更像是“事务日志”。更具体地说,这些日志没有必要直接供人类阅读。如有必要,某种“查看器”可以显示 ASCII 格式的内容。
因此我们计划将这些事务型日志写入高速二进制存储。
谢谢,下面的两个答案似乎都对我们开发自己的解决方案起到了很大的插入作用。
最佳答案
Log4net 不支持您描述的确切场景。然而,它确实提供了其他不锁定的附加程序,如数据库附加程序或 UDP 附加程序。这里有几个想法:
将您的消息记录到消息中排队,然后有一个读者(或几个读者)关闭消息队列并将它们写入日志。这提供了一个可靠的机制发送/写消息。说实话我不知道是否已经有一个MSMQ appender,但是写它你自己不会太辛苦。
使用UDP appender发送 消息,然后写你自己的 听这些的服务 消息并将它们写入文件。
我认为您可以在这里检测到一个主题...基本上使用非阻塞附加程序之一(或编写您自己的附加程序)并实现您自己的服务以接收来自附加程序的消息并将它们写入文件。
关于c# - 写入具有多线程性能问题的 log4net FileAppender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784371/
在我的应用程序中,我读取输入文件(例如 myFile1.txt)并创建一个具有相同名称的输出文件(例如 myFile2log)。要点是输入文件将在 java 应用程序中读取,而不是作为命令行参数给出。
在一个项目中,我在类路径上有以下内容: Bundle-ClassPath: ., lib/logback-classic.jar, lib/logback-core.jar, lib/slf4j
我需要登录到一个文件,因为客户没有我可以使用 log4net 登录的控制台。 现在我读到 FileAppender 不是线程安全的。无论如何,有没有一种方法可以在应用程序中登录到从不同线程注销的文件,
我有这样的附加程序。 logs\\${date}\\${thread}.log %level - %msg%n 我想 ${date} 和 ${thread} 是当前日期和当前线程名称。我该怎么
是否可以在 log4net 中配置 FileAppender 以在日志文件的开头添加新条目?目前,它正在末尾添加条目,并且读取最新条目需要向下滚动整个日志。从头开始读会更舒服。 最佳答案 我不知道该选
更新:有趣的是,我只看到以下问题发生在 Windows 环境中,但在部署的每个 Linux 环境中都工作正常。 我有一个带有 Log4j 1.2.17 和 fileAppender 的 Spring
我已经使用 slf4j/logback 一段时间了,我们在 logback.xml 中自定义的文件名是: ... ... /var/log/${ymd}/${HOSTNAME}-${US
这个问题在这里已经有了答案: How do you flush a buffered log4j FileAppender? (8 个答案) 关闭 5 年前。 我需要立即将日志刷新到磁盘,然后将其转
有人能解释一下 FileAppender 类是 RollingFileAppender 的父类(super class)和 WriterAppender 的子类吗?! 我试图寻找该类被弃用的原因,但找
我在使用带有文件记录的 log4j 时遇到问题。即使在网上搜索了很长时间后,我也无法让它工作。 我的 log4j.properties 文件: log4j.rootLogger = DEBUG,
我正在尝试使用 Log4j filappender 登录到 html 文件。我的属性文件如下所示 log = C:\Log log4j.rootLogger = DEBUG, FILE # Defin
我们使用 log4net 已经有一段时间了,但偶尔会遇到记录器无法每天滚动更新(通常是我们的服务)的问题。这会让人非常头疼,因为这意味着我们会在没有警告的情况下丢失日志记录,并且必须每天检查日志记录是
我必须根据某些条件将日志信息放在两个单独的日志文件中。如何做到这一点。这是我的 logging.properties 文件 log4j.rootLogger=debug, stdout, R log4
我正在使用 Log4j 作为我正在处理的项目中的日志记录框架。我有以下情况: Log4j 配置为将日志写入日志文件。在某些时候,此日志文件被复制到另一个目的地并被删除。日志记录框架继续工作,但日志不会
在 log4j 中,当使用具有 BufferedIO=true 和 BufferSize=xxx 属性(即启用缓冲)的 FileAppender 时,我希望能够在正常关闭过程中刷新日志。关于如何执行此
TickZoom 是一个非常高性能的应用程序,它使用自己的并行化库和多个 O/S 线程来平滑地利用多核计算机。 该应用遇到瓶颈,用户需要从单独的 O/S 线程将信息写入 LogAppender。 Fi
暂时忘记您为什么要这样做的问题 - 如果出于某种原因,两个 FileAppender 配置了相同的文件 - 这个设置会起作用吗? 最佳答案 Log4j 的 FileAppender 不允许两个 JVM
我需要将审计信息存储在 TEXT 文件 中。我计划使用 Apache Log4j 编写审计信息。 似乎是可靠的选择。但是,即使文件大小达到 3GB,我也应该能够写入审计信息 。 log4j 是否支持
在我当前的项目中,我需要让某个任务创建自己的日志文件,与 log4j.properties 中配置的内容分开。 我尝试通过将动态创建的 FileAppender 附加到 rootLogger 来实现此
我正在使用附加到 AsyncAppender 的 FileAppender 的本地变体。我正在为每个写入线程创建一个 FileAppender。我注意到当我的线程停止时(在 run() 的 while
我是一名优秀的程序员,十分优秀!