OpenResty 使用 ngx.timer.at 完成异步日志记录

OpenResty Lua About 1,079 words

方法说明

OpenResty中的ngx.timer.at可创建后台任务,在返回用户或接口信息后执行,配合log_by_lua*阶段可完成日志、PVUV等记录。

文档地址:https://github.com/openresty/lua-nginx-module#ngxtimerat

参数解释

hdl, err = ngx.timer.at(delay, callback, user_arg1, user_arg2, ...)
  • delay: 指定延迟时间执行,单位秒。传0立即执行,也可传0.001表示1毫秒后执行。
  • callback: 回调函数,在入参中加入premature会让Nginx内核自动调用。
  • user_atg1...: 调用时接收的参数。

代码示例

log_by_lua_file

local json = require "cjson.safe"
local db = require "module.db"

local function record_visit_data(premature, record)
    if not premature then
        ngx.log(ngx.ERR, json.encode(record))
        db.query(string.format("insert into test(a,b,c,d) values(%s,%s,%s,%s)", record.url, record.req_param, record.ua, record.referer))
    end
end

local record = {
    url = ngx.var.uri,
    req_param = ngx.var.args,
    ua = ngx.var.http_user_agent,
    referer = ngx.var.http_referer
}

local ok, err = ngx.timer.at(0, record_visit_data, record)
if not ok then
    ngx.log(ngx.ERR, "failed to create record_visit_data timer#", json.encode(record), ", err#", err)
    return
end

开源案例

https://github.com/fendoudebb/z-blog-openresty

Views: 6,605 · Posted: 2020-03-08

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh