11

我试图弄清楚如何执行以下操作:

  1. 请求进来了。

  2. 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 语句(在 lua 文件之后content_by_lua_file或在侧 lua 文件中)以及这个 if 语句应该是什么样子是一个挑战。

4

4 回答 4

30

access_lognginx 1.7.0+ 允许在指令本身中使用 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

于 2014-09-15T16:26:22.240 回答
4

你可以通过使用ngx.loglog_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了在日志阶段运行时调用的。在那个 ifngx.status == 200中,我们使用 ngx.log 来触发日志记录ngx.log

这将写入error_log. 不知道如何将其写入access_log.

以供参考

http://wiki.nginx.org/HttpLuaModule#ngx.log

http://wiki.nginx.org/HttpLuaModule#log_by_lua

于 2013-09-26T13:40:04.800 回答
4

每个问题都是答案的一部分。你非常接近:

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

于 2014-01-27T15:15:56.163 回答
2

这是我想出的解决方案:

认证.lua

-- Some logic goes here
-- ....
-- ....
ngx.var.return_status = 200

nginx.conf

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;
        }
     }
   }  
}
于 2013-09-27T12:38:16.810 回答