nginx+lua openresty开发系列-(log日志详解)

时间:2025-03-02 07:35:27

最近搭建流媒体服务器,其中涉及到一些http服务api的操作, 之前一直使用的是python django框架来处理这些信息, 这次编译的是nginx添加了lua模块, 就想着使用lua来完成这些功能, 减少服务的搭建。好久没有lua开发了,现在突然发现好多东西都记不住了, 所以就借着这次开发, 记录下经历的开发经历, 及必备所需的东西, 以备后续查找翻阅以及分享给大家。

日志, 是一个开发必备的东西, 特别是服务器,处理并发的服务器所一定调试要用到的。之前刚开始的时候还曾使用过使用文件io创建, 文件进行记录相关日志, 结果过程中出现的好多问题, 自己给自己弄得焦头烂额,后来主攻了这部分内容,最近在写lua接口的时候不知道怎么用了, 查询日志类型的时候,没有找到正确的地方, 日志类型也只查到了error级别, 造成了困扰,所以才有了写这系列的想法。

废话少说, 在学习一个领域的时候一定要有相应好的学习的网址来学习, 不管谁写的博客,资料,还是最原始的比较好
/openresty/lua-nginx-module
nginx 所有模块说明
/en/docs/
这都是最原始的资料, 里面也是最官方的说明, 内容非常好,必备网址
openresty是nginx lua的打包程序并对其做了优化, 所以openresty的说明也是官方,必备, 有一点特别好, 中国人自己写的, 所以有中文版,对于像我这样英文不怎么好的人来说就是一个福音
/book/moonbingbing/openresty-best-practices/details
/cn/
那搭建openresy nginx+lua开发环境呢,我本身是做流媒体开发的,所以我都是整体编译的。环境搭建过程请看我之前博客
/u012618915/article/details/81180421
以下是正题:

日志级别:
标准输出
紧急报错
报警
严重,系统故障, 触发运维告警系统
错误,业务不可恢复性错误
提醒, 业务中可忽略错误
提醒, 业务中比较重要信息
信息, 业务琐碎日志信息, 包含不同情况判断等
调试

这些都是常量, 越往上等级越高。

函数原型
(level, …)
基本都是在content阶段使用
示例
(, “num:”, num)
(, ” string:”.. str)

注意 print语句是INFO级别

lua中日志完成了, 那如何设置日志格式,日志格式呢, 那就需要使用nginx本身的log_format 进行设置了
log_format 属于 ngx_http_log_module

示例:
log_format main ‘ remoteaddr r e m o t e a d d r − remote_user [ timelocal]" t i m e l o c a l ] " request” ’
status s t a t u s body_bytes_sent “ httpreferer h t t p r e f e r e r ” ′ ‘ ” http_user_agent" "$http_x_forwarded_for”’;
这是我使用的日志格式
语法:
log_format name [escape=default|json|none] string …;

默认的log_format 为
log_format combined ‘ remoteaddr r e m o t e a d d r − remote_user [ timelocal] t i m e l o c a l ] ′ ‘ ” request" status s t a t u s body_bytes_sent ’
‘” httpreferer"" h t t p r e f e r e r "" http_user_agent”’;

现在开始设置日志输出level, 那如何设置日志级别呢, 那就需要使用nginx本身的error_log进行设置了,
error_log属于ngx_core_module
示例:
error_log logs/ error;
语法
error_log file [level];
默认的error_log为
error_log logs/ error;
上下文为:
main, http, mail, stream, server, location
level 等级
debug, info, notice, warn, error, crit, alert, emerg
大于等于设置等级的日志均会被记录
若要设置debug level则在编译的时候添加–with-debug 即 ./configure –with-debug

以上为日志基本常用的功能均已经介绍完,以下为高阶功能, 不常用
远程日志:
lua-resty-logger-socket
以非阻塞 IO 方式推送 access log 到远程服务器上。 对远程服务器的要求是支持 syslog-ng 的日志服务
示例
log_by_lua_block {
local logger = require “”
if not () then
local ok, err = {
host = ‘xxx’,
port = 1234,
flush_limit = 1234,
drop_limit = 5678,
}
if not ok then
(, “failed to initialize the logger: “,err)
return
end
end
local bytes, err = (msg)
if err then
(, “failed to log message: “, err)
return
end
优点:
基于 cosocket 非阻塞 IO 实现
日志累计到一定量, 集体提交, 增加网络传输利用率
短时间的网络抖动, 自动容错
日志累计到一定量, 如果没有传输完毕, 直接丢弃
日志传输过程完全不落地, 没有任何磁盘 IO 消耗

选择记录客户端debug日志 加编译选项(–with-debug)
示例
events {
debug_connection 192.168.1.1;
debug_connection 192.168.10.0/24;
}
日志为循环内存
error_log memory:32m debug;
这样做不影响高并发情况

gdb时可以这么用
set $log = ngx_cycle->log

while log>writer!=ngxlogmemorywriterset l o g − > w r i t e r ! = n g x l o g m e m o r y w r i t e r s e t log = $log->next
end

set buf=(ngxlogmemorybuft) b u f = ( n g x l o g m e m o r y b u f t ∗ ) log->wdata
dump binary memory debug_log.txt buf>start b u f − > s t a r t buf->end

如果觉得有用, 请关注我的博客!!!!
做专注最接地气流媒体相关内容!!!!
我以后也会尽可能,尽自己最大水平持续更新!!!!