使用数据库进行日志记录

12

为什么大多数日志文件似乎都是纯文本形式,而不是存放在MySQL/其他类型的数据库中?

对我来说,将它们存放到数据库中会使分析变得容易得多...但这是否会以速度或其他方面为代价呢?

(我并不太关心可移植性,并且显然你需要在数据库连接时使用文本日志。)

6个回答

15
我可以想到两个主要原因:
首先,当仅需要将信息追加到文件时,数据库比文本文件慢。对于数据库,您需要建立连接、通过网络传输数据、将其存储在索引结构中等等。而对于文件,您只需要将错误写入本地磁盘。
其次,有时您想记录的事情与数据库损坏有关。如果本地磁盘损坏,您面临的问题比生成日志文件要大得多。但即使其他所有内容都正常工作,您仍然可以记录数据库故障。
话虽如此,还是有很多情况下我想要记录的信息仅在应用程序正常运行且已连接到数据库时才相关,在这些情况下,我会直接记录到MySQL。

5
尽管您不关心可移植性,但我认为这是其中一个重要原因。文件I/O几乎是普及的,并且具有极其一致的API。其他优点包括:
  • 零件较少
  • 无需安装
  • 技能门槛低
  • 速度快
  • 成熟的日志记录、解析和管理工具集
  • 不依赖于网络(假设本地磁盘而不是NFS或其他远程存储)
  • 可靠性高
  • 仍然可以将其放入数据库中进行报告/分析
  • grep是您的朋友
  • 无需担心文件SQL注入等问题(对于存储数据而言,对于报告或随后的数据库上传并非必然如此)。

话虽如此,如果应用程序的性质适合于将日志记录到数据库中,则没有任何问题,我见过许多这样的应用程序。


5
历史上,数据库非常昂贵,你肯定不想在日志上浪费宝贵的数据库许可证。然而,现在的数据库相对便宜,处理也很便宜。使用数据库记录日志可能不会在经济上伤害到你。
日志文件的优点是你可以一直写到文件末尾。与使用数据库服务器相比,这是一个相对高效的操作。
数据库的优点是你可以将日志数据结构化为数据关系,并使用 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版本3.7.0,SQLite的开发人员已经实现了预写式日志记录。这使得写入速度更快。请查看此视频以获取更多详细信息。有了更快的写入速度,SQLite作为日志数据库变得更加有用。


1
这个建议有一个“小”问题:SQLite不支持并发读写访问,这意味着您将无法实时查看日志文件.. 在我看来,这是一个巨大的缺点。 - Liron Levi
3
使用3.7.0版本并启用写前日志记录,您将能够实时查看日志文件,因为写入者不会阻塞读取者。 - Jay Godse

1

数据库在内存、存储空间和效率方面都存在重大开销。向数据库添加新记录或修改现有记录的速度要慢得多。(此外,许多人对SQL和/或设置数据库的具体细节不熟悉。)

然而,如果您需要分析或指标评估能力,这些能力很难通过简单的文本文件获得,那么这当然没有问题。这非常取决于具体情况。


1

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

我认为当日志在远程机器上收集时(例如通过Linux上的syslog/rsyslog),DB日志记录变得更加有用,用于备份:如果原始机器受到攻击并且其日志被篡改,则这可以很有用。在这种情况下,在数据库中收集日志(也许特别是在远程机器上)非常有用,因为它可以帮助整理这些日志。您还可以使用phpLogCon等工具方便地浏览日志,或者使用自定义网页浏览它们(如果您只是进行一些临时监视,则通常比登录机器更容易)。

话虽如此,远程日志记录、将日志记录到数据库以及拥有一个漂亮的工具来浏览日志是相对独立的(我认为phpLogCon也可以处理文件日志)。如果我将日志存储在数据库中,我也会同时将日志存储在文件中,以便在与数据库的连接断开时能够阅读。


1

需要注意的是,你完全可以将日志写入文件(正如其他人指出的那样,这非常快速、高效和稳健),然后将数据转移到数据库中(可能在其他机器上),以便执行分析并利用典型的数据库功能加快速度。当然,这是可能的,因为通常不需要立即处理日志数据,所以推迟数据库的所有开销和脆弱性直到需要时才有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接