【发布时间】:2011-05-12 09:02:38
【问题描述】:
我们正在开发一种数据库工具,我们希望以可扩展且易于导入数据库表的格式编写日志文件。我们都觉得使用 SQL 过滤这些信息是个好主意,因为日志将是一个长文件,“搜索”可能不够好。你能给我一些建议吗?任何经验也将是有用的!提前致谢。
【问题讨论】:
-
您还没有表明您的性能预期...?日志文件的创建或后续的数据库导入时间是否关键?
我们正在开发一种数据库工具,我们希望以可扩展且易于导入数据库表的格式编写日志文件。我们都觉得使用 SQL 过滤这些信息是个好主意,因为日志将是一个长文件,“搜索”可能不够好。你能给我一些建议吗?任何经验也将是有用的!提前致谢。
【问题讨论】:
我要说的第一件事是您的文件格式应该是人类可读的。我的理由给here: Why should I use a human readable file format.
除此之外,不可能用如此模糊的问题来回答。但是,您应该考虑以下一些问题:
当您能够回答所有这些问题时,您可能自己就知道答案了。如果没有,请回答这些问题,让您的问题更加具体,这样别人会更容易帮助您。
就我个人而言,当日志数据被写入为 CSV 时,我一直很感激。它足够灵活,可以扩展(添加额外的列,更改字段的长度),可以快速读取和写入数据库电子表格以及数百种其他工具,并且可以在几秒钟内完成编码。但是,它确实有许多缺点——它很冗长,很容易出错,没有类型,并且如果重新排列列很容易破坏。
【讨论】:
我们发现日志往往是一个严重的性能问题。创建一个不会减慢您的公共网站速度的日志是一项挑战。
如果您有一个很大的日志,并且希望能够对其运行 SQL 查询而不会使它们变慢,那么您将需要在某些列上建立索引。您添加的每个索引都会大大减慢插入新日志条目的速度,从而导致高流量下的负载问题。
我们的技术是:
这让我们可以快速记录日志条目,而不会牺牲我们在日志表中的索引,同时也为我们提供了针对日志表的快速 SQL 查询。
我们已经在各种 CentOS 服务器上使用它大约 6 或 7 年了,它一直坚如磐石。我想根据操作系统及其配置方式,这可能不是创建日志文件的好方法。但它在我们的测试中效果很好。
PS:我认为使文件可读性没有任何意义。您只会在调试期间阅读它,然后您将永远不会再触摸它。
【讨论】:
我们正在开发一种数据库工具,我们希望以可扩展且易于导入数据库表的格式编写日志文件。我们都觉得使用 SQL 过滤这些信息是个好主意,因为日志将是一个长文件,“搜索”可能不够好。你能给我一些建议吗?
假设您有某些理由不直接插入数据库表中...
“可扩展”
“易于导入”
XML 是显而易见的选择,潜在的负面因素是:
在我开始写这篇文章的时候,你没有表达过担心。
任何经验也会很有用!
我们在日志中使用 XML 和其他格式的组合(一些对象具有 XML 序列化例程,但整个文件不是 XML)...这很痛苦,因为您不能对整个文件使用 XML 工具,并且格式足够复杂,以至于在没有适当工具的情况下无法轻松可靠地进行解析。所以,要么全力以赴,要么根本不去。
【讨论】:
<?xml ...><list><item>a</item><item>b</item><item>c</item></list> 与 ["a", "b", "c"]。 JSON 是一种很棒的格式,我将它用于各种事情,但请记住 XML 更加灵活。
由于我不确切知道它将如何存储在数据库或其他地方,我想我会设置一种可计算的格式并使其可以被工具解释以注入数据库或生成一个文件。
例如,我会制作一个简单的 xml 格式,或者如果我需要人类直接在初始格式内阅读,我会制作更易于阅读的东西。否则,我会使用 xml。
该文档将提供至少是日期时间、模块名称、日志级别和消息的信息。转换工具可以添加或忽略其他信息。
然后我会为数据库编写一个转换工具,也许是一些 python 脚本,它会解析 xml 文件并将数据注入数据库。该工具完全取决于上下文。
我也可能会编写一个脚本来生成日志的 html 视图。
主要思想是拥有一种可被不同工具轻松使用的可解释格式。这种格式只会提供原始信息,尽可能多的信息。 这样,转换工具将决定什么是有价值的,将日志中的数据放在哪里以及如何放置。
【讨论】: