哪种更好的日志记录方法-文件还是数据库?

时间:2020-03-05 18:43:41  来源:igfitidea点击:

好的,这是场景。我有一个实用程序,可以处理大量记录,并相应地将信息输入数据库。

它以多线程批处理这些记录。每个这样的批处理都写入同一日志文件,以为每个记录创建工作流跟踪。潜在地,我们一天可以写近一百万个日志。

是否应将此日志记录到位于另一台服务器上的数据库中?注意事项:

  • 多个线程写入同一个日志文件的明显缺点是,日志消息之间相互混排。在数据库中,可以按批次ID对它们进行分组。
  • 性能-哪些会减慢批处理的速度?写入本地文件或者将日志数据发送到同一网络上另一台服务器上的数据库。从理论上讲,日志文件更快,但是这里有陷阱吗?

两种方法都可以进行优化吗?

谢谢。

解决方案

回答

我认为这很大程度上取决于我们随后对日志文件的处理方式。

在这两个操作中,写入日志文件的速度会更快,尤其是当我们建议写入另一台服务器上的数据库时。

但是,如果我们随后尝试定期处理和搜索日志文件,那么最好的方法是数据库。

如果使用log4net之类的日志记录框架,它们通常会提供基于配置文件的简单方法,将输入重定向到文件或者数据库。

回答

数据库,因为我们提到了多个线程。同步以及过滤检索是我回答的原因。
在决定切换到文件之前,请先查看我们是否遇到性能问题
" Knuth:过早的优化是万恶之源",我在那本书中没有做进一步的介绍... :)

回答

我们可以通过多种方法来解决文件记录的局限性。

我们总是可以从某种类型的线程ID开始每个日志条目,然后grep出各个线程ID。或者每个线程使用不同的日志文件。

我过去以较低的优先级在单独的线程中登录数据库。我必须说,当我们试图找出问题出在哪里时,可查询性是非常有价值的。

回答

在这里,我第二个其他答案取决于我们对数据的处理方式。

这里有两种情况:

  • 大多数日志记录都记录在数据库中,因为我们所构建产品的管理员用户需要能够在其漂亮的小应用程序中查看所有信息。
  • 我们将所有诊断信息和调试信息记录到文件中。我们不需要真正地"美化"它和TBH,甚至不需要它,因此我们只记录和存档大部分。

我想说的是,如果用户正在使用它做任何事情,然后登录到DB,如果它适合我们,那么一个文件就足够了。

回答

如何记录到数据库文件(例如SQLite数据库)?我认为它可以处理多线程写入,尽管这可能也有其自身的性能开销。

回答

想到的一件事是,我们可以让每个线程写入其自己的日志文件,然后每天运行批处理以将它们组合在一起。

如果要登录到数据库,则可能需要进行一些调整和优化,尤其是在数据库将跨网络的情况下。至少我们将需要重新使用数据库连接。

此外,我们是否有登录数据库的特定需求?如果我们只需要一个" grep",那么我认为登录数据库并不会带来什么好处。

回答

一个有趣的问题,我们是否应该决定登录数据库,在哪里记录数据库连接错误?

如果我要登录到数据库,则在发生通信错误的情况下,我始终会有一个辅助日志位置(文件,事件日志等)。它确实确实使以后诊断问题变得更加容易。

回答

不确定是否有帮助,但是还有一个名为Microsoft LogParser的实用程序,可以用来解析基于文本的日志文件,并将其当作数据库使用。从网站:

Log parser is a powerful, versatile
  tool that provides universal query
  access to text-based data such as log
  files, XML files and CSV files, as
  well as key data sources on the
  Windows? operating system such as the
  Event Log, the Registry, the file
  system, and Active Directory?.  You
  tell Log Parser what information you
  need and how you want it processed.
  The results of your query can be
  custom-formatted in text based output,
  or they can be persisted to more
  specialty targets like SQL, SYSLOG, or
  a chart.  Most software is designed to
  accomplish a limited number of
  specific tasks. Log Parser is
  different... the number of ways it can
  be used is limited only by the needs
  and imagination of the user.  The
  world is your database with Log
  Parser.

我自己没有使用过该程序,但似乎很有趣!

回答

还是记录到队列怎么样?这样,只要我们想登录其他内容,就可以关闭轮询器。它使诸如滚动和归档日志文件之类的事情变得非常容易。这也很好,因为我们可以添加记录到不同内容的轮询器,例如:

  • 一个查找错误消息并将其发布到FogBugz帐户的轮询器
  • 一个轮询程序,查找对"黑客尝试"文件的访问冲突(" x试图访问/foo/y/bar.html")
  • 等等。

回答

我喜欢盖乌斯的回答。将所有日志语句放在线程安全队列中,然后从那里处理它们。对于DB,我们可以批量处理它们,例如说成批处理100条日志语句;对于文件,我们可以在它们进入队列时将它们流式传输到文件中。

文件还是Db?正如许多其他人所说的那样;这取决于我们需要的日志文件。