Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker 诊断工具


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

OpenResty Lua 评论 1 大约 1079 字

方法说明

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

阅读 5002 · 发布于 2020-03-08

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

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

扫描二维码关注我
昵称:
  • TripleZ 1楼
    log_by_lua 阶段已经将响应内容都发出去了,同步执行其实没有什么关系吧。私以为没有必要启动一个 timer 去做更新?
    Chrome Generic | Linux 2020-05-22
    作者回复
    嗯,是的。log_by_lua时内容已经写出去了,可以不加timer,但log_by_lua中有耗时操作,还将保留有本次请求的变量值。我这边是参考了OpenResty的README中的ngx.timer.at文档做的一个示例。
    Chrome 79.0 | Win10 2020-05-24
随便看看 换一批