使用数据库进行日志记录

时间:2010-06-22 01:00:42

标签: mysql database logging

是否有理由认为大多数日志都是纯文本,而不是放在MySQL /其他类型的数据库中?

在我看来,将它们放入数据库会使分析变得更容易,更容易......但这会牺牲速度还是别的呢?

(我不关心可移植性,显然你有数据库连接的文本日志。)

6 个答案:

答案 0 :(得分:13)

我可以想到两个重要原因:

首先,在简单地将信息附加到文件时,数据库比文本文件慢。使用数据库,您必须建立连接,通过网络传输数据,将其存储在索引结构中等等。使用文件,您只需将错误写入本地磁盘。

其次,有时您要记录的内容与数据库相关。如果本地磁盘坏了,那么比尝试生成日志文件有更大的问题。但即使其他所有工作正常,您也可以记录数据库中断。

话虽如此,有很多情况我想要记录的信息只在应用程序正常运行时才有用,并且我已经有了数据库连接。在这些情况下,我会直接登录MySQL。

答案 1 :(得分:4)

虽然你不关心便携性,但我认为这是其中很大一部分原因。文件I / O几乎是通用的,具有极其一致的API。其他优点包括:

  • 减少运动部件
  • 无需安装
  • 低技能障碍
  • 速度
  • 用于记录,解析,管理的成熟工具集
  • 不依赖于网络(假设本地磁盘而非NFS或其他远程存储)
  • 可靠性
  • 仍然可以将这些内容放入数据库进行报告/分析
  • grep是你的朋友
  • 不用担心SQL注入的文件(很好地存储数据,不一定是报告它或后续的数据库上传)。

也就是说,如果应用程序的性质适合这种情况,那么登录数据库没有任何问题,而且我已经看过很多应用程序都这样做了。

答案 2 :(得分:2)

从历史上看,数据库价格昂贵,您绝对不会在日志上浪费宝贵的数据库许可证。然而,今天的数据库相对便宜,处理也是如此。使用日志数据库可能不会在经济上扼杀你。

日志文件的优点是您可以继续写入它的末尾。与使用数据库服务器相比,这是一种相对有效的操作。

数据库的优点是您可以在数据关系中构建日志数据,然后可以使用SQL进行分析。这可以为您提供对软件操作的深入了解。

通过使用SQLite作为日志数据库,您可以充分利用这两个方面。 SQLite是一个带有SQL引擎的库,可以链接到您的程序中。您可以使用SQLite API打开数据库,运行SQL并关闭数据库,而不是fopen / fwrite / fclose。没有数据库服务器,因为SQLite引擎操作在应用程序的进程中运行...就像fopen / fwrite / fclose一样。一旦在SQLite数据库中捕获数据(所有数据都存储在一个简单文件中),就可以使用SQL来分析日志数据。查看http://www.squidoo.com/sqlitehammer#module5800826以获取示例。

--------编辑2010年8月------------

SQLite的开发人员已经实现了SQLite version 3.7.0的写入日志记录。这使得写入速度更快。查看this video了解更多详情。通过更快的写入,SQLite作为日志数据库更加有用。

答案 3 :(得分:1)

数据库在内存,存储空间和效率方面包含巨大的开销。将新记录添加到数据库或修改现有记录要慢得多。 (此外,许多人不熟悉SQL和/或设置数据库的细节。)

但是,如果您需要通过简单的文本文件难以获得的分析或度量评估功能,那么肯定没有错。这是个案情况。

答案 4 :(得分:1)

(其他人已经指出了基于文件的日志记录的许多优点。)

我认为在远程计算机上收集日志(例如,通过Linux上的syslog / rsyslog)进行备份时,数据库日志记录会变得更有用:如果原始计算机遭到入侵并且其日志发生变化,这将非常有用。在这种情况下,收集数据库中的日志(可能特别是在远程计算机上)很有用,因为它可以帮助整理这些日志。您还可以通过phpLogCon等工具更方便地浏览日志,或使用自定义网页浏览日志(如果您只是进行一些随意监控,这通常比登录到计算机更容易)。

这就是说,远程日志记录,记录到数据库并拥有一个很好的工具来浏览日志是相当独立的(我认为phpLogCon也可以使用文件日志)。如果我将日志存储在数据库中,我还会同时将日志存储在文件中,如果只是为了能够在与数据库的连接关闭时读取。

答案 5 :(得分:1)

重要的是要注意,没有理由不能将日志写入文件(正如其他人所指出的那样,非常快速,高效且健壮),然后将数据卸载到数据库中(可能在某些数据库中)其他机器)为了执行分析,通过具有典型的数据库功能来加速分析。当然,这是可能的,因为日志数据通常不需要立即进行压缩 - 因此将数据库的所有开销和脆弱性推迟到需要之前是有意义的。