什么是最好的日志文件格式?

时间:2011-05-12 09:02:39

标签: java c++ c

我们正在开发一个数据库工具,我们希望以一种可扩展且易于导入数据库表的格式编写日志文件。我们都觉得使用SQL过滤这些信息是一个好主意,因为日志将是一个长文件,“搜索”可能不够好。你能给我一些建议吗?任何经验也都有用!提前致谢。

4 个答案:

答案 0 :(得分:9)

我要说的第一件事是你的文件格式应该是人类可读的。我的理由是here: Why should I use a human readable file format.

除此之外,用这样一个模糊的问题回答是不可能的。但是,以下是您应该考虑的一些问题:

  1. 此日志文件有多大?这与您拥有的空间相比如何?如果空间成为一个问题,那么更简约的格式会更好 - 例如Protocol Buffers
  2. 如何查看日志文件?如果它使用特定工具,则格式比使用文本编辑器或excel
  3. 时更重要
  4. 您存储的是哪种数据?如果它只是ASCII文本,那么CSV效果很好。
  5. 您的数据中的类型信息是否很重要?您是否需要将数字和日期作为数字和日期而不仅仅是字符串进行比较?如果是这样,那么某种类型的系统(例如XMLJSON)可能会更好
  6. 数据是否会转移给其他人?在这种情况下,具有良好的阅读和写作语言工具的东西可能很重要
  7. 需要多快写入数据?如果速度是一个问题(它可能是实时日志文件),那么为此优化的格式可能很重要。
  8. 需要多快读取数据?
  9. 是否所有数据都需要在内存中,还是可以以序列化方式进行扫描?
  10. 当你能回答所有这些问题时,你可能会自己知道答案。如果没有,请回答这些问题,使您的问题更加具体,并且有人会帮助您更轻松。

    当我将日志数据写成CSV时,我一直很感激。它足够灵活,可以扩展(添加额外的列,更改字段的长度),快速读取和写入数据库电子表格,以及数百种其他工具,并且可以在几秒钟内编码。然而,它确实有许多缺点 - 它是冗长的,容易逃脱错误,无类型,并且如果重新排列列,容易中断。

答案 1 :(得分:6)

我们发现日志往往是严重的性能问题。创建一个不会减慢公共网站速度的日志具有挑战性。

如果你有一个大型日志并希望能够在没有它们的情况下对它运行SQL查询,那么你需要在某些列上使用索引。您添加的每个索引都会大大减慢插入新日志条目的速度,从而导致高流量时出现负载问题。

我们的技术是:

  • 使用简单格式化的基本纯文本文件作为日志文件(例如:制表符分隔)
  • 不使用XML,它会使事情变得更复杂(即缓慢)而没有任何好处。
  • 网站使用UNIX文件锁定为每个日志条目添加一行
  • 一个cron作业每10分钟将日志内容插入一个SQL数据库(我们使用MySQL,但这取决于你)。
  • 此cron作业一次处理一行文件,使用UNIX文件锁定来防止在处理日志时写入日志,但是在处理完每行并从文件中删除后,公共站点有机会点击日志(如何以您的首选语言执行此操作将是堆栈溢出的第二个问题)
  • cron作业的超时时间为5分钟(因此,每10分钟处理一次,最多花费5分钟。这样可以确保服务器在出现性能问题时无法无限期地处理日志文件)

这使我们可以快速记录日志条目而不会牺牲日志表中的索引,从而为我们提供针对日志表的快速SQL查询。

我们已经在各种CentOS服务器上使用了大约6年或7年,并且它一直坚如磐石。我想根据操作系统及其配置方式,这可能不是创建日志文件的好方法。但它在我们的测试中效果很好。

PS:我认为使文件具有人类可读性没有任何意义。您只会在调试过程中阅读它,然后再也不会再触摸它了。

答案 2 :(得分:2)

  

我们正在开发一个数据库工具,我们希望以一种可扩展且易于导入数据库表的格式编写日志文件。我们都觉得使用SQL过滤这些信息是一个好主意,因为日志将是一个长文件,“搜索”可能不够好。你能给我一些建议吗?

假设您有理由不直接插入数据库表...

“可伸展”

  • 您可能希望在文件本身中包含元数据(字段名称和/或类型)
    • 这可以让你创建一个通用的,在很大程度上面向未来的数据库导入工具,它可以根据日志文件创建和填充数据库结构(而不​​是在日志文件格式发展时需要编辑的紧密耦合的东西)< / LI>
  • 可以更轻松,更干净地扩展supoprts层次结构的记录日志格式

“易于导入”

  • 您要么需要第三方工具/库支持的一些非常常见的格式(XML,CSV,SQL插入语句或SQL工具支持的任何表转储格式)或者非常简单易于编写和维护的内容

XML是显而易见的选择,潜在的负面因素是:

  • 冗长
  • 性能
  • 可读性

当我开始写这篇文章时,你们没有表达过任何关注。

  

任何经验也都有用!

我们在日志中使用XML和其他格式的组合(某些对象具有XML序列化例程但整个文件不是XML)...这很痛苦,因为您无法在整个文件中使用XML工具而且格式的复杂程度足以阻止简单而可靠的解析,而无需使用适当的工具。所以,完全不管怎么样。

答案 3 :(得分:1)

由于我不确切知道它将如何存储在数据库或其他地方,我想我会设置一个可计算的格式并使其可以通过工具解释以注入数据库或生成带有。

的文件

例如,如果我需要人类直接在初始格式内阅读,我会制作一个简单的xml格式,或更人性化的东西。否则,我会使用xml。

该文档将提供至少是日期时间,模块名称,日志级别和消息的信息。可以添加其他信息,也可以通过转换工具加入。

然后我会为数据库编写一个转换工具,可能是一些python脚本,它会解析xml文件并将数据注入数据库。该工具完全取决于具体情况。

我也可以写一个脚本来生成日志的html视图。

主要思想是拥有一种可以被不同工具轻松使用的可解释格式。该格式只提供原始信息,并提供必要的信息。 这样转换工具就会决定什么是值得的,在哪里以及如何从日志中输入数据。