服务器日志:存储于数据库还是日志文件中?

10
我一直在开发一个服务器,现在开始实现日志记录。但是,我不确定是否应该使用数据库进行日志记录,还是只用纯文本文件。
我计划对每个请求记录一些基本信息(请求类型、请求的IP地址、会话跟踪)。对于某些请求,可能会有扩展信息(有关所做请求类型的详细信息),如果有任何错误,我也会记录下来。
一方面,将日志记录到数据库中意味着我可以对记录的数据运行查询。另一方面,我不确定这是否会给数据库带来不必要的负担。当然,我也可以同时使用数据库和日志文件进行日志记录。大家对适当的日志记录有什么想法?
(如果有区别的话,我正在使用Apache服务器上的mod_python和MySQL数据库。因此,我要么使用logging库,要么在数据库中创建一些日志记录表。)

1
你可以选择SQLite,它正如开发者所说的“设计用来替代fopen()”,位于两者之间。 - Mark Rushakoff
11个回答

10

首先,使用像SLF4J/Logback这样的日志库,允许您动态地做出此决策。然后,您可以调整配置文件,并将一些或所有日志消息路由到几个不同的目的地。

在记录日志到应用程序数据库之前,请非常小心,如果您记录了大量的内容并且容量开始增加,那么您可能会使数据库不堪重负。并且如果您的应用程序接近满负荷运行或处于故障模式,则日志消息可能无法访问,您就无法获得相关信息。应该发送到应用程序数据库的可能只有高级别的应用程序导向事件(一种应用程序数据类型)。

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

日志文件可以被读取到特殊的分析数据库中,在那里您可以使用例如Hadoop来对日志数据进行映射/缩减分析。


1
将日志记录到像splunk这样的syslog服务器,它支持许多日志格式,并且您可以在那里记录数据库日志以及http服务器,然后您可以从一个漂亮易用的GUI中进行交叉引用。 确保您正在使用异步日志记录(log4j和许多其他应用程序都具有此类附加程序)。 - feniix
1
SLF4J/Logback是基于Java的解决方案。Python内置了一个广泛的日志记录模块。 - John Mee
@John:太好了,Java的日志记录在三个主要竞争者(java.util.logging、Log4J、Jakarta Commons Logging)之间相当分散。SLF4J试图将所有这些内容整合成一个连贯的整体。Python团队非常明智地这样做了。 - Jim Ferrans
Python日志记录是类似于Apache Log4j的API,几乎兼容。 - Phyo Arkar Lwin

2
混合使用文件日志和数据库是最好的。将需要分析的信息记录到数据库中,例如每天平均用户数量等。同时使用文件日志来存储一些调试信息。

1

我们一直将数据记录到一个独立的数据库中。

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

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

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


1
如果您选择一种可解析的日志文件格式,那么您可以记录到文件中,然后有一个外部进程(可能是由cron运行)处理您的日志文件并将详细信息插入到数据库中。这可以在应用程序和数据库负载较低时安排发生。
我总是担心数据库变得不可用会发生什么:这会阻止应用程序运行或以任何方式降低它的性能吗?记录到文件系统避免了处理该问题,但您仍需要担心磁盘填满和日志文件轮换的问题。

1

只有在它产生收益时才记录日志到数据库。

例如,对于一个网站,我们将网站中放置的所有广告记录到数据库中。这产生了收入。没有必要为重要的东西解析日志文件。

其他所有内容都存储在文件系统中。

用于调试的日志记录到文件系统中。通常是私有的内容。实现细节。不要共享。

Apache将大量信息记录到文件系统中。不要重复此操作。

访问控制日志记录到文件系统中。您很少需要详细查看这些日志。

用户活动可能需要总结到数据库中。这是您想要研究以改进您的网站的营销和可用性信息。但是,详细的活动信息过于庞大,无法记录在数据库中。将其放在文件系统中,并将其摘要成营销/产品改进/可用性分析数据库。


0

实际上,能够在数据库/文件日志记录之间切换似乎非常重要。数据库日志记录似乎比纯文本文件日志记录慢得多,这可能会在日志流量高时变得重要。 当我有同样的要求时,我制作了一个库(可以独立运行或作为处理程序),它可以将日志记录到数据库和/或文件中,并允许归档关键消息(例如,存档可以是数据库而所有内容都存储在文本文件中)。 它可能会避免您从头开始编写另一个... 请参见:The rrlog library


0

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


0

如果您考虑调整标准的Python日志记录器以记录到数据库中,那么这个示例可能会为您提供一个良好的开端:将日志记录到Jabber帐户


0

我主要会使用文件系统日志记录,就像大多数其他答案建议的那样。使用Python的logging包,您可以通过调整这里提出的建议轻松创建数据库处理程序。您还可以创建自定义过滤器实例并将其附加到数据库处理程序上-这将允许您在运行时确定实际记录到数据库中的事件类型。与其他答案一致,我认为只有某些类型的事件值得记录到数据库以供以后分析。

如果您的主要应用程序具有高吞吐量,则我同意将日志记录到单独的数据库(在单独的服务器上)的建议。


0

日志的类型取决于您对数据要做什么以及如何做。如果您打算基于此日志数据库构建报告系统,则将日志记录到数据库中是有利的。否则,您可以以特定格式记录日志,稍后如果要使用数据进行分析,可以解析它。例如,从文件日志中,您可以仅解析所需信息,并根据需要生成CSV文件。如果您计划使用数据库记录器,正如之前建议的那样,请将其与应用程序数据库分开。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接