使用数据库作为存储介质在.NET中实现日志记录库

我刚刚开始研究一个日志库,每个人都可以使用它来跟踪用户运行我们的应用程序时的任何类型的系统信息。 到目前为止,最简单的示例是跟踪信息,警告和错误。

我希望所有插件都能够使用此function,但由于每个开发人员可能对报告的重要性有不同的想法,因此我希望尽可能保持通用。

在C ++世界中,我通常会使用像stl::pair这样的东西作为键值对结构,并且在这些日志中有一个stl::list作为“行”。 然后,日志缓存将是一个list<list<pair>> (唉!)。 这样,开发人员可以使用像INFO,WARNING,ERROR这样的const字符串键来为数据库中的列提供一致的命名(用于选择特定类型的信息)。

我希望数据库能够处理任意数量的不同列名。 例如,John可能有一个INFO行,其中一列名为USER,而Bill可能有一个INFO行,其中一列名为FILENAME。 我希望日志查看器能够显示所有信息,如果一个报告没有INFO / FILENAME的值,那些字段应该只显示为空白。 因此,一种选择是使用List<List<KeyValuePair> ,另一种选择是让日志库使用者以某种方式“注册”其模式,然后让数据库执行ALTER TABLE来处理这种情况。 另一个想法是拥有一个仅用于键值对的表,其中一个外键将键值对映射回原始日志条目。

我显然不希望日志记录陷入困境,因此我只锁定日志缓存以复制数据(并删除已经复制的数据),然后后台线程将信息转储到数据库。

我对此的具体问题是:

  1. 你看到任何性能问题吗? 换句话说,你有没有试过这样的事情,发现某些事情在实践中效果不好?
  2. 除了List<List<KeyValuePair>>之外,还有更多的.NETish方法来实现键值对吗?
  3. 即使有办法更好地做#2,我上面提出的ALTER TABLE的想法是不是很糟糕?
  4. 你会推荐一个多个数据库吗? 我还不知道日志写入的频率,但理想情况下我们希望有大量的低级信息。 也许应该有一个只有低级别东西的固定模式的数据库,然后是另一个更灵活的数据库,用于向用户报告信息。

你为什么不查看log4net ? 它可能足以满足您的目的,您可以避免重新发明已经多次发明的轮子:-)

这里有一些关于如何在数据库中存储日志记录信息的配置示例:

http://logging.apache.org/log4net/release/config-examples.html

与其他人已经注意到的一样,有几种流行的日志框架具有许多内置function。 虽然他们都没有你想要的灵活性,但我的经验是你永远不需要那种灵活性。 它只记录:-)。

以下是一些常见日志记录库的列表:

  • log4net的
  • NLOG
  • 企业图书馆
  • 白蚁
  • ELMAH
  • CuttingEdge.Logging
  • (我错过了吗?)

如果您在选择一个时遇到问题,请使用日志记录外观来隐藏实现。 为此您可以选择:

  • Common.Logging
  • 简单的记录立面 。
  1. 直到有一些(Knuth)。
  2. 创建实际建模日志条目的模型,然后将它们缓存在List中
  3. 我提供标准字段并将所有用户配置存储为XML。 允许灵活的日志记录系统,不会导致架构更改,并且(至少在Sql Server中)可搜索。
  4. 更多数据库是更多维护。 把事情简单化。 实际上,只需使用Log4net。