关于多线程:哪种日志记录更好的方法是文件还是数据库?

关于多线程:哪种日志记录更好的方法是文件还是数据库?

Which is a better approach in logging - files or DB?

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

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

是否应将此日志放入另一个服务器上的数据库?注意事项:

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

    谢谢。


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

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


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

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

    此外,您是否有登录数据库的特定需求?如果您只需要一个" grep",那么我认为登录数据库并不会获得多少收益。


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

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

    不确定是否有帮助,但是还有一个名为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.

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


    在这里我将其他答案列为第二个,具体取决于您对数据的处理方式。

    这里有两种情况:

  • 大多数日志记录都记录在数据库中,因为我们所构建产品的管理员用户需要能够在其漂亮的小应用程序中查看所有信息。

  • 我们将所有诊断信息和调试信息记录到文件中。我们不需要真正地"美化"它和TBH,我们甚至不需要它,因此我们大部分时间只进行日志和存档。

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


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


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

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

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


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


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

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


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

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

    但是,如果您随后尝试定期处理和搜索日志文件,则最好的位置是数据库。

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


    推荐阅读