nginx 模块为日志模块设置变量值

nginx module to set variable value for log module

提问人:Arieh Leviav 提问时间:8/1/2019 最后编辑:Arieh Leviav 更新时间:8/4/2019 访问量:1054

问:

我想定义一个 nginx 变量,在请求期间设置其值,并在日志格式中使用该变量。

我目前正在用 C 语言实现一个自定义模块(目前对 LUA 不感兴趣)。

所需流量:
1.配置新的日志格式:(nginx.conf)
2.使用以下格式配置新的访问日志:(nginx.conf)
3.在请求处理程序期间设置值,函数类型如下:
log_format my_format '$my_var1';access_log /tmp/out my_format
typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);

电流:
1.将变量设置为初始值:(nginx.conf)
2.用
3 按索引查找变量。通过赋值给数据字段来更改变量值。
set $my_var1 'empty_value';ngx_http_get_flushed_variable(r, index)

当我将变量打印到调试日志时,我看到变量已正确设置为更改的值。但是,日志模块将初始变量值(而不是更改值)输出到自定义访问日志。

有人可以指出我在这里错过了什么吗?
我应该使用函数还是使用脚本编译/复杂?
ngx_http_add_variable

上述当前流程的简短片段:

ngx_http_variable_value_t *v;
v = ngx_http_get_flushed_variable(r, ale_srv_cf->output_variable_index);
// ... error handling if not found ....
v->data = new_value;
v->len = new_value_length;

C 变量 nginx 模块

评论

0赞 Tarun Lalwani 8/4/2019
不确定一个模块是否可以调用另一个模块,如果可以,那么您可能需要调用 github.com/nginx/nginx/blob/...?什么的ngx_stream_log_flush
0赞 Arieh Leviav 8/5/2019
Tarun,我没有提到模块调用另一个模块的这种连接。我的模块只设置变量的值
0赞 Tarun Lalwani 8/5/2019
明白了,我误读了,尽管您正在更改日志格式本身。
0赞 Tarun Lalwani 8/5/2019
我认为这可能是正确的方法?github.com/peter-leonov/ngx_http_js_module/blob/......
0赞 Arieh Leviav 8/5/2019
@TarunLalwani,不幸的是,我仍然无法让它工作,因为用于在您建议的模块中使用的 ngx_hash_find()->data 和我最初使用的 ngx_http_get_variable() 都返回指向同一ngx_http_variable_value_t结构的指针。因此,似乎无论我使用哪种方式来获取此结构,分配给它,仍然不起作用。wdyt?也许还有其他想法吗?

答: 暂无答案