2010-12-16 229 views
5

我正在使用ColoredConsoleAppender,我很担心它是否会挂起我的应用程序。 任何人有经验log4net是否会挂起应用程序?

+0

不只是ColoredConsoleAppender。即使ConsoleAppender也以相同的方式挂起。 – 2011-03-14 11:53:05

回答

3

从log4net的网站: http://logging.apache.org/log4net/release/faq.html

号log4net的是不可靠的。这是一个尽力而为和失败停止记录系统。

通过fail-stop,我们的意思是log4net不会在运行时抛出意外的异常,从而可能导致应用程序崩溃。如果出于任何原因,log4net会抛出一个未捕获的异常(除了可能抛出的ArgumentException和ArgumentNullException外),请发送电子邮件至[email protected]邮件列表。未捕获的异常被视为需要立即关注的严重错误。

我个人一直都在使用它,并且从未遇到过问题。

+0

我很担心至少ColoredConsoleAppender会挂起应用程序。我实际上遇到了一个 – user496949 2010-12-16 06:10:12

+0

@ user496949:我遇到了同样的问题。我正在使用一个不可思议的过程并使用ColoredConsoleAppender进行追加。 – 2011-03-09 10:01:51

+0

我实际上解决了这个问题:调用进程没有从输出流中读取,最终流是“完整的”。 – 2011-03-09 15:12:34

2

@ ralf.w。已经显示了完整的症状。我也可以改写,因为我最近也遇到同样的问题。

  1. 开发使用ColoredConsoleAppender(或ConsoleAppender)打印出日志的控制台应用程序。
  2. 开发另一个应用程序(在我的情况下WinForms)来执行该控制台(使用Process.Start)。 UseShellExecute = false以重定向标准输出和错误。 CreateNoWindow = true。 WindowStyle =隐藏。

然后在少数机器(或远程桌面会话)上,log4net将挂起控制台应用程序,在挂起转储中,您可以看到它奇怪地等待写入流完成。

难以在普通机器上重现(如我的),尽管log4net是开源的,但很难进一步调查。

解决方法可以如控制台应用程序最小化(而不是隐藏)和/或更改其他ProcessStartInfo设置一样简单。

+1

我们看到类似的东西。我们确定log4net(和/或Windows)缓冲最多4KB的输出到stdout/stderr。在该缓冲区填满后,进一步的日志调用将挂起。 因此,如果进程A启动进程B,并将进程B日志传送到控制台,并且进程A不从其启动的进程读取标准输出(进程B),则进程B将在缓冲区填满后挂起。 转向重定向解决了这个问题。进行过程读取标准输出也可以解决问题。 – Jimothy 2012-10-04 22:56:48

+0

@Jimothy你为我解决了问题;)Thx。 – nozzleman 2017-08-23 08:06:53