在nginx中收集请求日志,异步归总到消息队列(nsq)
最近公司的服务器经常因为磁盘被日志文件写爆,磁盘不可用后导致接口请求报错,为此经常要定期删除服务器日志以腾出磁盘空间。有没有更好的办法解决磁盘容量太小,日志保存不能太多、时间不能太长的麻烦呢?我试想过,将接口日志收收集后转储到公司内部服务器,做离线存储方案,这样有三个好处:
1、海量接口日志不用再占用线上服务器的有限磁盘空间,节省费用;
2、在负载均衡多节点的部署架构下,避免日志文件的分散导致的查阅不方便;
3、归总转储离线后,日志可以更长时间的存储,本地集中查阅高效,为进一步分析提供了可能性。 比如:收集日志后,可以统计每日访问的pu、pv,可以分析每个接口请求频次;但业务操作存在bug时,可以借助日志分析问题原因……
但如何转储呢?在网上查阅了一些资料,有人利用kafka消息队列+lua,集中存储nginx请求日志到kafka中。
最近刚好在研究nsq,借此做一个基于nsq+lua的nginx日志转储方案,如下!
一、资源下载:
依赖:
https://github.com/openresty/lua-cjson/archive/2.1.0.6.tar.gz
https://github.com/openresty/lua-resty-core/archive/v0.1.13.tar.gz
lua-nsq:
https://github.com/rainingmaster/lua-resty-nsq
注意将Makefile文件里修改lua相关参数 :
#LUA_INCLUDE_DIR ?= $(PREFIX)/include
#LUA_LIB_DIR ?= $(PREFIX)/lib/lua/$(LUA_VERSION)
LUA_INCLUDE_DIR ?= $(PREFIX)/include/luajit-2.0
LUA_LIB_DIR ?= $(PREFIX)/lib/lua/5.1
二、nginx站点server里配置如下:
body_filter_by_lua '
local resp_body = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or"") .. resp_body
';
log_by_lua_file /data/service/tengine/conf/lua/log.lua;
三、log.lua脚步如下:
……