Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Log4Net和来自并行实例的日志记录_Logging_Log4net_Parallel Processing_Fileappender - Fatal编程技术网

Logging Log4Net和来自并行实例的日志记录

Logging Log4Net和来自并行实例的日志记录,logging,log4net,parallel-processing,fileappender,Logging,Log4net,Parallel Processing,Fileappender,我在我的项目中使用log4net,有一个问题。 程序的主要功能需要很长时间,我使用日志记录来保存有关它的信息。我使用FileAppender将日志保存到文件中 我的应用程序位于共享(本地)文件夹中,可能有多个应用程序实例从一个路径运行。在这种情况下,我只能记录来自第一个程序的信息,而我的应用程序的其他实例无法记录信息,因为日志文件已锁定 当我使用“log4net.Appender.FileAppender+MinimalLock”选项时,会出现信息丢失的情况。并非两个实例中的所有日志都保存到文件

我在我的项目中使用log4net,有一个问题。 程序的主要功能需要很长时间,我使用日志记录来保存有关它的信息。我使用FileAppender将日志保存到文件中

我的应用程序位于共享(本地)文件夹中,可能有多个应用程序实例从一个路径运行。在这种情况下,我只能记录来自第一个程序的信息,而我的应用程序的其他实例无法记录信息,因为日志文件已锁定

当我使用“log4net.Appender.FileAppender+MinimalLock”选项时,会出现信息丢失的情况。并非两个实例中的所有日志都保存到文件中

如何解决此问题并从并行实例记录信息?当我使用“MinimalLock”选项时,性能会下降吗


谢谢。希望您的帮助。

也许您可以从每个实例登录到不同的文件?否则,您可能需要设置一个专门用于日志记录的单独进程。程序的每个实例都会在那里发送日志消息,并负责将其附加到文件中。这也许可以通过使用SocketAppender来实现。此外,我发现使用RollingFileAppender将日志输出分解成卡盘更容易处理

您可以创建一个自定义附加器,打开文件进行写入,然后关闭它。如果它碰到一个锁定的文件,它可能会暂停并重试几次

在自定义appender中,您还可以在共享写入模式下打开文件,这将允许多个写入程序,但这不会阻止日志行合并在一起

如果您没有编写大量数据,上面列出的打开/关闭机制可能是您的最佳选择。注意,由于文件的不断打开和关闭,如果记录大量数据,您可能会看到明显的性能影响


一个更复杂的机制,但可以提供高性能日志路径:编写一个日志服务,通过TCP或UDP接收日志行。该服务将负责缓冲数据并将其写入磁盘。过去我们使用这种方法(不是通过Log4NET,而是一般的解决方案)来提高日志写入效率。

肯定考虑为每个进程创建不同的日志文件,可能使用时间戳生成的唯一文件名。

< P>我认为这是一个典型的集中式日志记录解决方案的情况。与其担心文件和性能瓶颈,我宁愿将日志语句异步地传输到某个远程服务,该服务将负责存储和处理日志。看看这个名为的日志聚合器,它的设计目的是将应用程序与日志管理分离。它应该与标准的log4net UDP appender一起工作,并将根据应用程序、主机、线程等对日志数据进行分区。。同时允许您在真正需要时随时创建日志文件


披露:我是本产品的作者。

只需在日志文件名中包含应用程序的进程id即可。然后,应用程序的不同实例将登录到不同的文件。以下是一个例子:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

使用进程间锁代替最小锁可以减少多个进程访问单个日志文件时的数据丢失

log4net.Appender.FileAppender+InterProcessLock

能否将日志写入数据库而不是文件?使用文件的主要原因是我需要排除所有数据库连接。如何从运行时指定日志文件名?我认为这只能从配置中获得。档案?你说得对,我从臀部开枪。。。时间戳可以工作,但为新进程配置新日志文件名会变得很棘手。回答已修改,谢谢。你能提供一些我如何创建自定义文件附加器的示例吗?检查:对于允许多个实例的简单桌面应用程序来说似乎有些过分。其他人注意:请非常小心不要错过
type=“log4net.Util.PatternString”
属性,否则它将无法工作!另外,从中,
也可以工作(即,不需要
。是否会发生冲突?是否最好使用进程启动的时间加上进程id?