我刚刚开始开发一个日志库,每个人都可以使用它来在用户运行我们的应用程序时跟踪任何类型的系统信息。到目前为止最简单的示例是跟踪信息、警告和错误。
我希望所有插件都能够使用此功能,但由于每个开发人员可能对报告的重要内容有不同的想法,因此我希望尽可能保持通用。
在 C++ 世界中,我通常会使用类似stl::pair<string,string>
充当键值对结构,并具有stl::list
这些充当日志中的“行”。日志缓存将是list<list<pair<string,string>>>
(啊!)。这样,开发人员可以使用常量字符串键(如 INFO、WARNING、ERROR)为数据库中的列提供一致的命名(用于选择特定类型的信息)。
我希望数据库能够处理任意数量的不同列名。例如,John 可能有一个 INFO 行,其中包含名为 USER 的列,而 Bill 可能有一个 INFO 行,其中包含名为 FILENAME 的列。我希望日志查看器能够显示所有信息,如果一份报告没有 INFO / FILENAME 值,则这些字段应该显示为空白。所以一种选择是使用List<List<KeyValuePair<String,String>>
>,另一个是让日志库使用者以某种方式“注册”其模式,然后让数据库执行ALTER TABLE
来处理这种情况。还有一个想法是拥有一个仅用于键值对的表,并使用一个将键值对映射回原始日志条目的外键。
我显然不希望日志记录使系统陷入困境,因此我只锁定日志缓存来复制数据(并删除已复制的数据),然后后台线程将信息转储到数据库。
我对此的具体问题是:
- 您发现任何性能问题吗?换句话说,您是否曾经尝试过类似的方法,但发现某些方法在实践中效果不佳?
- 还有吗.NETish实现键值对的方法,除了
List<List<KeyValuePair<String,String>>>
?
- 即使有一种方法可以做得更好,我上面提出的 ALTER TABLE 想法是一件坏事吗?
- 您会推荐多个数据库而不是单个数据库吗?我还不知道写入日志的频率,但理想情况下我们希望拥有大量低级信息。也许应该有一个具有固定模式的数据库,仅用于低级别的内容,然后另一个数据库可以更灵活地向用户报告信息。
你为什么不检查一下log4net http://logging.apache.org/log4net/?这可能足以满足您的目的,并且您将避免重新发明已经发明多次的轮子:-)
这里有一些关于如何在数据库上存储日志信息的配置示例:
http://logging.apache.org/log4net/release/config-examples.html http://logging.apache.org/log4net/release/config-examples.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)