如何只写200状态的日志

我想弄清楚如何做到以下几点:

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

    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

    你可以通过使用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阶段运行时调用的log_by_lua 。 在这种情况下,如果ngx.status == 200 ,我们使用ngx.log来使用ngx.log来触发日志记录。

    这将写入error_log 。 不知道如何写入access_log

    以供参考

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

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

    这是我提出的解决方案:

    auth.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; } } } } 

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

     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