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

它以多线程批量处理这些记录。每个此类批次都会写入同一日志文件,以便为每条记录创建工作流程跟踪。我们一天可能会写入近一百万个日志。

是否应该将此日志放入驻留在另一台服务器上的数据库中?注意事项:

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

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

谢谢。

有帮助吗?

解决方案

我在这里附议其他答案, 取决于您对数据的处理方式.

我们这里有两种情况:

  1. 大部分日志记录都记录在数据库中,因为我们构建的产品的管理员用户需要能够在他们漂亮的小应用程序中查看它们,并提供所有附加功能。

  2. 我们将所有诊断和调试信息记录到文件中。我们不需要真正“美化”它,而且说实话,我们甚至不经常需要它,所以我们只是记录和归档大部分内容。

我想说,如果用户正在用它做任何事情,然后登录到数据库,如果它适合你,那么一个文件可能就足够了。

其他提示

有趣的问题是,如果您决定记录到数据库,那么您在哪里记录数据库连接错误?

如果我登录到数据库,我总是有一个辅助日志位置(文件、事件日志等),以防出现通信错误。它确实让以后诊断问题变得更加容易。

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

如果您要记录到数据库,您可能需要进行一些调整和优化,特别是当数据库跨网络时。至少您需要重用数据库连接。

此外,您对登录数据库有什么具体需求吗?如果您需要的只是一个“grep”,那么我认为您通过登录数据库不会获得太多好处。

不确定它是否有帮助,但还有一个实用程序称为 微软日志解析器 据说您可以使用它来解析基于文本的日志文件并像使用数据库一样使用它们。来自网站:

日志解析器是一种功能强大的通用工具,可提供对基于文本数据的通用查询访问,例如日志文件,XML文件和CSV文件,以及Windows®操作系统(例如事件日志,注册表,注册表)上的关键数据源文件系统和ActiveDirectory®。您告诉日志解析器您需要哪些信息以及如何处理它。查询的结果可以在基于文本的输出中自定义形式,也可以将其持续到SQL,Syslog或图表等更专业的目标。大多数软件旨在完成有限的特定任务。日志解析器不同...它可以使用的方式仅受用户的需求和想象力的限制。世界是带有日志解析器的数据库。

我自己没有使用过这个程序,但它看起来很有趣!

或者记录到队列怎么样?这样,当您想登录不同的内容时,您就可以切换轮询器。它使得诸如滚动和归档日志文件之类的事情变得非常容易。这也很好,因为您可以添加记录不同事物的轮询器,例如:

  • 一个轮询器,用于查找错误消息并将其发布到您的 FogBugz 帐户
  • 一个轮询器,用于查找“黑客尝试”文件的访问违规(“x 试图访问 /foo/y/bar.html”)
  • ETC。

数据库 - 因为你提到了多线程。同步和过滤检索是我回答的原因。
在决定切换到文件之前查看是否存在性能问题
“高德纳:过早的优化是万恶之源”我在那本书中没有进一步了解......:)

有多种方法可以解决文件日志记录的限制。

您始终可以使用某种线程 ID 来启动每个日志条目,并 grep 出各个线程 ID。或者每个线程都有不同的日志文件。

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

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

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

在这两个操作中,写入日志文件会更快 - 特别是当您建议写入另一台服务器上的数据库时。

但是,如果您随后尝试定期处理和搜索日志文件,那么执行此操作的最佳位置将是数据库。

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

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

文件还是数据库?正如许多其他人所说;这取决于您需要日志文件的用途。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top