我们正在开发一个数据库工具,我们希望以一种可扩展且易于导入数据库表的格式编写日志文件.我们都觉得使用SQL过滤这些信息是一个好主意,因为日志将是一个长文件,"搜索"可能不够好.你能给我一些建议吗?任何经验也都有用!提前致谢.
我要说的第一件事是你的文件格式应该是人类可读的.我的理由在这里给出:我为什么要使用人类可读的文件格式.
除此之外,用这样一个模糊的问题回答是不可能的.但是,以下是您应该考虑的一些问题:
这个日志文件有多大?这与您拥有的空间相比如何?如果空间成为一个问题,那么更简约的格式就更好 - 例如Protocol Buffers.
如何查看日志文件?如果它使用的是特定工具,则格式比使用文本编辑器或excel时更重要
你存储什么样的数据?如果它只是ASCII文本,那么CSV效果很好.
类型信息在您的数据中是否重要?您是否需要将数字和日期作为数字和日期而不仅仅是字符串进行比较?如果是这样,那么某种类型的系统(例如XML或JSON)可能会更好
数据是否会转移给其他人?在这种情况下,具有良好语言阅读和写作工具的东西可能很重要
数据需要多快写入?如果速度是一个问题(它可能是实时日志文件),那么为此优化的格式可能很重要.
需要多快读取数据?
所有数据都需要在内存中,还是可以以序列化方式进行扫描?
当你能回答所有这些问题时,你可能会自己知道答案.如果没有,请回答这些问题,使您的问题更具体,并且有人可以更轻松地为您提供帮助.
就个人而言,当日志数据写成CSV时,我一直很感激.它足够灵活,可以扩展(添加额外的列,更改字段的长度),快速读取和写入数据库电子表格,以及数百种其他工具,并且可以在几秒钟内编码.但是,它确实有许多缺点 - 它是冗长的,容易逃脱错误,无类型,并且如果重新排列列,则容易中断.
我们发现日志往往是一个严重的性能问题.创建不会减慢公共网站速度的日志具有挑战性.
如果您有一个大型日志并希望能够在没有慢速的情况下对它运行SQL查询,那么您将需要某些列上的索引.您添加的每个索引都会大大减慢插入新日志条目的速度,从而导致高流量时出现负载问题.
我们的技术是:
使用简单格式化的基本纯文本文件作为日志文件(例如:制表符分隔)
不使用XML,它会使事情变得更复杂(即缓慢)而没有任何好处.
该网站使用UNIX文件锁定只为每个日志条目附加一行
一个cron作业每10分钟将日志的内容插入一个SQL数据库(我们使用MySQL,但这取决于你).
这个cron作业一次处理一行文件,使用UNIX文件锁定来防止在处理日志时写入日志,但是在处理完每行并从文件中删除之后,公共站点有机会点击日志(如何用您的首选语言执行此操作将是堆栈溢出的第二个问题
cron作业的超时时间为5分钟(因此每10分钟处理一次,最多花费5分钟.这可确保服务器在出现性能问题时无法无限期地处理日志文件)
这使我们可以快速记录日志条目,而不会牺牲日志表中的索引,从而为我们提供针对日志表的快速SQL查询.
我们已经在各种CentOS服务器上使用了大约6或7年,并且它一直坚如磐石.我想根据操作系统及其配置方式,这可能不是创建日志文件的好方法.但它在我们的测试中效果很好.
PS:我认为使文件具有人类可读性没有任何意义.您只会在调试期间阅读它,然后再也不会再触摸它.