好的,这就是我想做的。我的网络服务器(运行 openSuSE 11.1)上有一个 squid 代理设置,每次向 access.log 添加新条目时,我都想将访问信息转储到 MySQL 数据库。我这样做的最佳方法是什么?
目前,我正在考虑编写一个守护进程,每隔 2-3 秒检查一次文件的更改,但我认为这不是一种非常有效的方法。我还能以什么其他方式实现这一目标?
您还应该看看 iNotify:
http://linux.die.net/man/7/inotify
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
我建议您将 squid 直接登录到数据库中,或者有一个(持续运行的)守护程序,它(名义上)在日志文件上执行“tail -f”,插入记录。
根据您可以容忍的数据丢失量,您可能需要做很多技巧,以持久的方式记住您到达的文件中的“点”(比如数据库中的一个小表,您在同一事务中写入该表) 等。正确地执行此操作并非易事,但是,它可以做到。
通常你会希望异步执行此操作,因为 squid 可能会比 mysql 更快地在文件中创建记录,尤其是当它离线时。
您还需要对记录进行批处理,因为插入单个记录的效率相对较低。
我找到的最好的解决方案,对我的要求非常具体,是对 Squid 使用“redirect_program”:http ://wiki.squid-cache.org/Features/Redirectors
这非常适合我的目的,并在程序中为我提供了足够的信息来做我的事情。
感谢 paulsm4 提供的完美解决方案,以防此类功能不可用。
不知道这是否可行,但也许您可以使用CSV 存储引擎创建一个表,并让 squid 代理直接写入创建的table.CSV
文件而不是access.log
一个。