服务器日志记录 - 在数据库或日志文件中?

时间:2009-06-28 22:23:18

标签: python logging

我一直在服务器上工作,我开始实现日志记录。但是,我不确定是否应该使用db进行日志记录,或者仅使用纯文本文件。

我打算记录每个请求的一些基本信息(请求的类型,请求的IP地址,会话跟踪)。对于某些请求,将提供扩展信息(详细说明请求的类型),如果有任何错误,我也会记录这些错误。

一方面,将日志放入数据库意味着我可以对记录的数据运行查询。另一方面,我不确定这是否会对db造成不必要的压力。当然,我也可以使用db和日志文件进行日志记录。人们对正确伐木的想法是什么?

(如果它有所不同,我在带有MySQL数据库的Apache服务器上使用mod_python。所以我要么使用logging库,要么只在db中创建一些日志表。)< / p>

11 个答案:

答案 0 :(得分:10)

首先,使用像SLF4J / Logback这样的日志库,它允许您动态地做出这个决定。然后,您可以调整配置文件,并将部分或全部日志消息路由到多个不同目的地中的每一个。

在登录到您的应用程序数据库之前要非常小心,如果您记录了大量内容并且音量开始变高,则可以轻松地淹没它。如果您的应用程序运行接近满容量或处于故障模式,则日志消息可能无法访问,您将失明。可能应用于应用程序数据库的唯一消息是面向应用程序的高级事件(一种应用程序数据)。

“登录到文件系统”要好得多(对于大型生产环境,包括记录到冗余日志聚合服务器读取的多播地址)。

可以将日志文件读入特殊的分析数据库,您可以使用例如Hadoop对日志数据进行映射/缩减分析。

答案 1 :(得分:2)

混合file.log + db将是最好的。 登录您最终可能需要分析的数据库信息,例如每天的平均用户数等。 并使用file.log存储一些调试信息。

答案 2 :(得分:1)

我们始终将数据记录到单独的数据库。

这使我们可以查询而不会影响应用程序数据库。如果我们意识到我们需要禁用日志记录或更改我们记录的数量,它也会简化事情。

但是大多数现代日志库都支持将日志记录嵌入到您的应用程序中,并通过配置选择目标 - 文件,数据库等等。

Logger为您提供了许多管理日志记录的方法,虽然默认包没有数据库记录器,但编写这样的事件处理程序并不困难。

答案 3 :(得分:1)

如果决定可解析的日志文件格式,则可以登录到文件,然后使用外部进程(可能由cron运行)来处理日志文件并将详细信息插入到数据库中。这可以安排在应用程序和数据库负载较低时发生。

我总是担心如果数据库变得不可用会发生什么:这会阻止您的应用程序运行,还是以任何方式降级它?记录到文件系统避免了必须处理该问题,但您仍然需要担心磁盘填满和日志文件轮换。

答案 4 :(得分:1)

只有在产生收入的情况下才能登录到数据库。

例如,对于一个站点,我们将放置在网站中的所有广告记录到数据库中。它产生了收入。没有理由为重要的事情解析日志文件。

其他所有内容都会进入文件系统。

登录文件系统进行调试。这通常是私人的东西。实施细节。不要分享。

Apache将大量内容记录到文件系统中。不要复制这个。

访问控制日志转到文件系统。您很少想详细查看这些内容。

用户活动可能必须汇总到数据库中。这是您希望学习以改善网站的营销和可用性信息。但是,详细的活动信息太多而无法在数据库中记录。将其放在文件系统上,并将其消化为营销/产品改进/可用性分析数据库。

答案 5 :(得分:0)

如果你考虑调整标准的Python记录器来登录数据库,这个方法可能会给你一个良好的开端:Logging to a Jabber account

答案 6 :(得分:0)

我主要使用文件系统日志记录,就像大多数其他答案一样。使用Python的日志包,您可以通过调整here建议来轻松创建数据库处理程序。您还可以创建自定义Filter实例并将其附加到数据库处理程序 - 这将允许您在运行时确定您实际登录到数据库的确切事件。与其他答案一致,我想说只有将某些类型的事件记录到数据库中才能进行后续分析。

如果您的主应用程序是高吞吐量,我同意建议登录到单独的数据库(在单独的服务器上)。

答案 7 :(得分:0)

日志记录的类型取决于您要对数据执行的操作以及您将如何执行操作。如果要基于此日志数据库构建报告系统,则记录到db是有利的。否则,如果要将数据用于某些分析,可以使用特定格式记录事物,以后可以解析。例如,您可以从文件日志中仅解析所需信息,并在需要时生成CSV。如果您计划使用db logger,如已建议的那样,请将其与应用程序db。

分开

其次,您可以考虑让记录器独立于您的主应用程序。生成执行日志记录的线程,或者在特定端口/套接字上运行记录器并将日志消息传递给它,或者将所有日志记录消息一起收集并在每个周期结束时将其刷新到日志中。

答案 8 :(得分:0)

我们两个都做。

我们记录运营信息/进度等。到日志文件。标准日志文件。

在数据库中,我们记录操作的状态。例如。每个处理过的项目,我们可以对吞吐量/经过时间等进行查询。当趋势和检测异常(系统“太安静”等)可能表明其他问题时,此数据特别有用。

答案 9 :(得分:0)

确实,以后可以在DB / File日志记录之间切换这一点非常重要。数据库日志记录似乎比纯文本文件日志记录慢得多,这对于高日志流量可能变得很重要。 当我有相同的要求时,我已经建立了一个库(可以独立运行或作为处理程序)。它会记录到数据库和/或文件中,并允许存档关键消息(例如,存档可能是一个数据库,而所有内容都会进入文本文件。) 它可以让你免于从头编写另一个... 请参阅:The rrlog library

答案 10 :(得分:0)

看起来很多人都在将一些事件记录到数据库中。我也这样做,但它增加了一点延迟。你们有没有通过消息队列登录数据库?如果是这样,你用什么排队和你的日志记录架构是什么样的?我正在使用Java / J2EE。