2020-05-01 19:56:10
看过本章第一节的同学应该还记得,log_by_lua* 是一个请求经历的最后阶段。由于记日志跟应答内容无关,Nginx 通常在结束请求之后才更新访问日志。由此可见,如果我们有日志输出的情况,最好统一到 log_by_lua* 阶段。如果我们把记日志的操作放在 content_by_lua* 阶段,那么将线性的增加请求处理时间。
在公司某个定制化项目中,Nginx 上的日志内容都要输送到 syslog 日志服务器。我们使用了lua-resty-logger-socket这个库。
调用示例代码如下(有问题的):
-- lua_package_path "/path/to/lua-resty-logger-socket/lib/?.lua;;";
--
-- server {
-- location / {
-- content_by_lua_file lua/log.lua;
-- }
-- }
-- lua/log.lua
local logger = require "resty.logger.socket"
if not logger.initted() then
local ok, err = logger.init{
host = 'xxx',
port = 1234,
flush_limit = 1, --日志长度大于flush_limit的时候会将msg信息推送一次
drop_limit = 99999,
}
if not ok then
ngx.log(ngx.ERR, "failed to initialize the logger: ",err)
return
end
end
local msg = string.format(.....)
local bytes, err = logger.log(msg)
if err then
ngx.log(ngx.ERR, "failed to log message: ", err)
return
end
在实测过程中我们发现了些问题:
缓存无效:如果 flush_limit 的值稍大一些(例如 2000),会导致某些体积比较小的日志出现莫名其妙的丢失,所以我们只能把 flush_limit 调整的很小
自己拼写 msg 所有内容,比较辛苦
那么我们来看lua-resty-logger-socket这个库的 log 函数是如何实现的呢,代码如下:
function _M.log(msg)
...
if (debug) then
ngx.update_time()
ngx_log(DEBUG, ngx.now(), ":log message length: " .. #msg)
end
local msg_len = #msg
if (is_exiting()) then
exiting = true
_write_buffer(msg)
_flush_buffer()
if (debug) then
ngx_log(DEBUG, "Nginx worker is exiting")
end
bytes = 0
elseif (msg_len + buffer_size < flush_limit) then -- 历史日志大小+本地日志大小小于推送上限
_write_buffer(msg)
bytes = msg_len
elseif (msg_len + buffer_size <= drop_limit) then
_write_buffer(msg)
_flush_buffer()
bytes = msg_len
else
_flush_buffer()
if (debug) then
ngx_log(DEBUG, "logger buffer is full, this log message will be "
.. "dropped")
end
bytes = 0
--- this log message doesn't fit in buffer, drop it
...
由于在 content_by_lua* 阶段变量的生命周期会随着请求的终结而终结,所以当日志量小于 flush_limit 的情况下这些日志就不能被累积,也不会触发 _flush_buffer 函数,所以小日志会丢失。
这些坑回头看来这么明显,所有的问题都是因为我们把 lua/log.lua 用错阶段了,应该放到 log_by_lua* 阶段,所有的问题都不复存在。
修正后:
lua_package_path "/path/to/lua-resty-logger-socket/lib/?.lua;;";
server {
location / {
content_by_lua_file lua/content.lua;
log_by_lua_file lua/log.lua;
}
}
这里有个新问题,如果我的 log 里面需要输出一些 content 的临时变量,两阶段之间如何传递参数呢?
方法肯定有,推荐下面这个:
location /test {
rewrite_by_lua_block {
ngx.say("foo = ", ngx.ctx.foo)
ngx.ctx.foo = 76
}
access_by_lua_block {
ngx.ctx.foo = ngx.ctx.foo + 3
}
content_by_lua_block {
ngx.say(ngx.ctx.foo)
}
}
更多有关 ngx.ctx 信息,请看这里http://github.com/openresty/lua-nginx-module#ngxctx
开启mysql general log记录sql日志
03-18
记录一次Zabbix-server由于磁盘空间不足迁移数据库的过程
07-19
Docker命令行参考(21) – docker logs获取容器的日志
02-27
Docker实践(19) – 保留容器的bash历史记录
04-21
Fluentd日志同步软件入门教程
05-22
Power Console Plus管理软件如何查看日志
02-24
ThinkPad X220t电池下的SIM卡插槽正确的插卡方向
04-24
Win7如何清除资源管理器中地址栏中的历史记录
07-14
Win8系统下如何删除历史搜索记录
06-04
Y450桌面导航、一键影音、杜比如何确认驱动已正确安装
06-29
Y530,V550Windows 7系统下遥控器驱动如何确认安装正确。
06-07
awk查看统计Nginx访问日志
03-26
logrotate日志分割工具使用介绍
02-15
logstash解析naxsi日志的问题
05-28
mongodb日志存储优化
07-02
nginx日志切割shell脚本
05-13
使用 logstash + kafka + elasticsearch 实现日志监控
03-09
使用zabbix根据时间监控多行格式的日志
04-03
启动QQ2010等软件的时候报错“应用程序的并行配置不正确”
02-27
在QQ设置中如何正确选择摄像头
07-07
Kainet LogViewPro(网站日志分析软件) v3.19.4 免费版
5.9M
下载nero刻录软件(光盘记录软件) V16.0.24.0 破解版
179.65 MB
下载天盾微信聊天记录恢复软件下载
17.9MB
下载宝宝成长记录系统
19.25 MB
下载日程提醒软件(日程安排记录提醒软件) v5.60.559 中文免费版
15.3M
下载楼月键盘屏幕全记录(电脑监控软件) v3.4 破解版
955KB
下载清除上网痕迹(上网记录擦除工具) 1.2 免费版
345KB
下载键盘记录器(幕键盘记录工具) 2.0 破解版
29.4MB
下载Apache Logs Viewer破解版
22.98 MB
下载班级优化大师
79.83 MB
下载