1

好的,这就是我想做的。我的网络服务器(运行 openSuSE 11.1)上有一个 squid 代理设置,每次向 access.log 添加新条目时,我都想将访问信息转储到 MySQL 数据库。我这样做的最佳方法是什么?

目前,我正在考虑编写一个守护进程,每隔 2-3 秒检查一次文件的更改,但我认为这不是一种非常有效的方法。我还能以什么其他方式实现这一目标?

4

4 回答 4

2

您还应该看看 iNotify:

http://linux.die.net/man/7/inotify

http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring

于 2011-07-08T06:29:54.873 回答
1

我建议您将 squid 直接登录到数据库中,或者有一个(持续运行的)守护程序,它(名义上)在日志文件上执行“tail -f”,插入记录。

根据您可以容忍的数据丢失量,您可能需要做很多技巧,以持久的方式记住您到达的文件中的“点”(比如数据库中的一个小表,您在同一事务中写入该表) 等。正确地执行此操作并非易事,但是,它可以做到。

通常你会希望异步执行此操作,因为 squid 可能会比 mysql 更快地在文件中创建记录,尤其是当它离线时。

您还需要对记录进行批处理,因为插入单个记录的效率相对较低。

于 2011-07-08T06:36:32.010 回答
0

我找到的最好的解决方案,对我的要求非常具体,是对 Squid 使用“redirect_program”:http ://wiki.squid-cache.org/Features/Redirectors

这非常适合我的目的,并在程序中为我提供了足够的信息来做我的事情。

感谢 paulsm4 提供的完美解决方案,以防此类功能不可用。

于 2011-07-08T06:40:02.257 回答
0

不知道这是否可行,但也许您可以使用CSV 存储引擎创建一个表,并让 squid 代理直接写入创建的table.CSV文件而不是access.log一个。

于 2011-07-08T07:23:56.167 回答