创建一个记录器

创建一个记录器

问题描述:

这不是一个真正的编码问题,但是在开发新的Logger实现的同时,我从社区获得了关于我遇到的一些问题的一些反馈。创建一个记录器

背景

我们的ASP.NET应用程序最初使用log4net。虽然log4net是一款出色的日志记录工具,但它并不适合我们的需求,在某些情况下,它甚至会通过日志记录的方式导致我们的应用程序出现问题。我们目前正在实施我们自己的日志系统,它模仿log4net的一些行为,但也适合我们的需要。我不是在这里讨论log4net的使用或如何配置它。

系统

目前我们有一个系统正在开发。该系统有一个记录器类,它是一个Singleton(设计缺陷,我知道...),并且该类有一个集合IReporter对象。

每次应用程序调用Logger.Instance.Log(消息)记录仪将引导这些消息每IReporter队列里面,记者在他们的目的地/存储/记录的信息的任何责任。

目前我们已经选择每个IReporter都有一个backgroundthread和一个消息队列来以自己的速度处理消息。这里的危险是,当应用程序突然死亡时,我们可能会丢失一些消息。

我们想到的另一种方法是在记录器上有一个线程池,并让这些线程在队列上运行,然后将消息委托给记者。

我关心的是表现。我们首先在记录器中使用事件来实现此功能,但访问文件时,生成的线程很快就变得很快。所以现在用这种方法,我们希望限制对资源的访问

我想要的是那些有类似情况的人以及他们如何解决这个问题。

+3

你看过NLog吗? HTTP:// n日志项目。org/ –

+0

我们正在处理一个商业应用程序,所以开源并不是一个真正的选择atm –

+0

不会立即帮你,但我强烈建议你看一下NLog和Log4net的源代码。他们竭尽全力确保日志记录的高效性。另外,除非在应用程序中配置了日志,否则可能需要禁用日志记录,然后可以在必要时将其打开。这包括在跟踪语句之前插入if语句块,或者将跟踪语句放入委托中,这样即使在禁用日志记录时字符串格式代码也不会运行。不会帮助BG线程问题,但他们也解决了这个问题(我只是不知道如何:) –

我的理解是否正确,并且所有这些进程都访问同一组文件?在Windows上?

你不应该这样做,因为操作系统会做一些复杂的锁定,这需要时间,或者更糟的是,取决于你如何访问文件,你可能会遇到死锁。最好在一个线程上完成所有日志记录,然后按顺序运行IReporter。

如果您担心您的软件可能在日志操作过程中死掉,请将日志记录器放入另一个进程中,由IPC进行通信。但是你确定要重塑syslogd吗?

+0

目标是为每个日志文件设置1个记者,特别是为了防止多个线程访问特定的日志文件并陷入困境。 –

您的设计听起来很像Log4Net与一堆FileAppender s。你应该真的重新考虑你的决定,除非你有没有要求你没有分享。 Log4Net的lot更多地使用在现场比你的记录器有史以来,它有很多的bug和性能问题已经摆脱它。