代码之家  ›  专栏  ›  技术社区  ›  Vaibhav

在日志文件或数据库中,哪种方法更好?

  •  7
  • Vaibhav  · 技术社区  · 16 年前

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

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

    是否应将此日志记录到驻留在另一台服务器上的数据库中?考虑事项:

    1. 多个线程写入同一个日志文件的明显缺点是,日志消息在彼此之间被洗牌。在数据库中,它们可以按批次ID分组。
    2. 性能-哪个会更慢批处理?写入本地文件或将日志数据发送到同一网络上其他服务器上的数据库。从理论上讲,日志文件更快,但是这里有没有解决方法?

    是否可以对这两种方法进行任何优化?

    谢谢。

    10 回复  |  直到 16 年前
        1
  •  2
  •   Rob Cooper    16 年前

    我把其他答案放在第二位, 取决于你对数据做了什么 .

    这里有两种情况:

    1. 大部分的日志记录都是在数据库中,因为我们构建的产品的管理员用户需要能够在他们漂亮的小应用程序中看到它们,并且有所有的铃声和口哨声。

    2. 我们将所有诊断和调试信息记录到文件中。我们不需要真正的“美化”它和tbh,我们甚至不经常需要它,所以我们只是记录和存档的大部分。

    我会说,如果用户对它做了任何操作,那么登录到db,如果它是为您做的,那么一个文件可能就足够了。

        2
  •  6
  •   ZombieSheep    16 年前

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

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

        3
  •  3
  •   Rowan    16 年前

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

    如果您要登录到数据库,您可能需要进行一些调整和优化,特别是在数据库将通过网络的情况下。至少您需要重用DB连接。

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

        4
  •  2
  •   onnodb    16 年前

    不确定是否有用,但还有一个实用程序 Microsoft LogParser 可以用来解析基于文本的日志文件,并像数据库一样使用它们。从网站:

    日志分析器是一种功能强大、功能广泛的 提供通用查询的工具 访问基于文本的数据,如日志 文件、XML文件和csv文件,如 以及 Windows操作系统,如 事件日志、注册表、文件 系统和Active Directory。你 告诉日志分析器您的信息 需要以及您希望如何处理它。 查询结果可以是 在基于文本的输出中自定义格式, 或者他们可以坚持到更多 特殊目标,如SQL、Syslog或 图表。大多数软件的设计目的是 完成有限数量的 具体任务。日志解析器 不同…有多少种方法 使用受到需求的限制 以及用户的想象力。这个 世界是你的日志数据库 语法分析器。

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

        5
  •  2
  •   James A. Rosen    16 年前

    或者登录到队列?这样你就可以在你想登录不同的东西的时候关掉轮询器。它使滚动和归档日志文件变得非常容易。这也很好,因为您可以添加记录不同内容的轮询器,例如:

    • 查找错误消息并将其发送到您的FogBugz帐户的轮询器
    • 查找“黑客入侵尝试”文件的访问冲突(“x尝试访问/foo/y/bar.html”)的轮询器。
    • 等。
        6
  •  1
  •   Gishu    16 年前

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

        7
  •  1
  •   Josh    16 年前

    有一些方法可以克服文件日志记录的局限性。

    您总是可以用某种类型的线程ID来启动每个日志条目,并对各个线程ID进行grep处理。或每个线程的不同日志文件。

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

        8
  •  1
  •   SDI    16 年前

    比如说一个sqlite数据库,记录到数据库文件怎么样?我认为它可以处理多线程写入——尽管这也可能有它自己的性能开销。

        9
  •  0
  •   samjudson    16 年前

    我认为这很大程度上取决于你以后对日志文件做了什么。

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

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

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

        10
  •  0
  •   noocyte    16 年前

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

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