我正在试图弄清楚如何执行以下操作:
请求即将开始。
HttpLuaModule
对请求执行一些操作。如果请求有效,则Lua将使用ngx.exit(202)
完成处理。但是在处理过程中可能会(并且将会)出现一些条件,nginx
可能会返回403,404,503错误。
我想要写的是只访问具有200状态代码的请求的日志。 基本上我想做这样的事情:
location /foo {
content_by_lua_file "/opt/nginx/lua/process.lua";
if (status == 200) {
access_log "/path/to/the/access_log"
}
我对nginx和lua都很陌生,所以对我来说,找出放置位置和if语句(在content_by_lua_file
之后或在lua文件中)以及if if语句是一个挑战应该看起来像。
答案 0 :(得分:22)
nginx 1.7.0+允许在access_log
指令本身中使用if条件。
access_log path [format [buffer=size [flush=time]] [if=condition]];
The if parameter (1.7.0) enables conditional logging.
A request will not be logged if the condition evaluates to “0” or an empty string
结合map
指令,可以根据各种条件将日志事件发送到不同的日志。
http {
map $status $normal {
~^2 1;
default 0;
}
map $status $abnormal {
~^2 0;
default 1;
}
map $remote_addr $islocal {
~^127 1;
default 0;
}
server {
access_log logs/access.log combined if=$normal;
access_log logs/access_abnormal.log combined if=$abnormal;
access_log logs/access_local.log combined if=$islocal;
}
}
http://nginx.org/en/docs/http/ngx_http_log_module.html
http://nginx.org/en/docs/http/ngx_http_map_module.html
答案 1 :(得分:4)
您可以使用ngx.log
和log_by_lua
指令来完成此操作。
location /conditional_log{
log_by_lua 'if ngx.status == 200 then ngx.log(ngx.ERR, "It is 200") end';
content_by_lua 'ngx.say("I am ok") ngx.exit(200)';
}
在上面的代码中,我们使用在日志阶段运行时调用的log_by_lua
。如果是ngx.status == 200
,我们使用ngx.log来使用ngx.log
触发日志记录。
这将写入error_log
。不确定如何将其写入access_log
。
供参考
答案 2 :(得分:3)
每个问题都是答案的一部分。你非常接近:
if ($status != "200") {
access_log off;
}
在此处查看版本可用性的信息。 http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
此外,几乎所有访问日志格式变量都以“现代”版本提供: http://nginx.org/en/docs/http/ngx_http_log_module.html
答案 3 :(得分:2)
这是我提出的解决方案:
-- Some logic goes here
-- ....
-- ....
ngx.var.return_status = 200
http {
lua_package_path .....;
lua_package_cpath ....;
rewrite_by_lua_no_postpone on;
server {
set $return_status 1;
location /foo {
rewrite_by_lua_file "<apth_to_aut.lua";
if ($return_status = 200) {
access_log <path_to_access_log> format;
return 200;
}
}
}
}