创建记录器

时间:2011-11-18 12:56:52

标签: c# asp.net .net log4net

这不是一个真正的编码问题,但我正在听取社群对我所遇到的一些问题的一些反馈,同时开发一个新的Logger实现。

背景

我们的ASP.NET应用程序最初使用log4net。虽然log4net是一个很好的日志记录工具,但它不适合我们的需求,在某些情况下,它甚至会通过日志记录的方式给我们的应用程序带来问题。我们目前正在实施我们自己的日志系统,它模仿了log4net的一些行为,但也根据我们的需求量身定制。我不是来讨论log4net的用法或如何配置它。

系统

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

每当应用程序调用 Logger.Instance.Log(消息)时,记录器会将这些消息定向到队列中的每个 IReporter ,并且记者负责记录目的地/存储中的消息/无论如何。

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

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

我关注的是性能。我们首先使用记录器中的事件实现了这一点,但是在访问文件时,生成的线程变得非常快。所以现在采用这种方法我们希望限制对资源的访问

我所关注的是有类似情况的人以及他们如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

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

你不应该那样做,因为操作系统会做一些需要时间的复杂锁定,或者更糟糕的是,根据你访问文件的方式,你可能会遇到死锁。最好在一个线程上执行所有日志记录,然后按顺序运行IReporters。

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

答案 1 :(得分:0)

你的设计听起来很像Log4Net,有很多FileAppender个。你应该重新考虑你的决定,除非有你没有分享的要求。 Log4Net在现场使用很多比你的记录器更多,并且已经有很多错误和性能问题已经被淘汰了。