mirror of
https://gitee.com/iresty/apisix.git
synced 2024-12-03 12:37:36 +08:00
This reverts commit 89f89f3004
.
This commit is contained in:
parent
89f89f3004
commit
13b0968340
@ -26,6 +26,7 @@ local ngx_re = require("ngx.re")
|
||||
|
||||
|
||||
local _M = {
|
||||
version = 0.2,
|
||||
new = new_tab,
|
||||
clear = require("table.clear"),
|
||||
nkeys = nkeys,
|
||||
@ -34,7 +35,6 @@ local _M = {
|
||||
sort = table.sort,
|
||||
clone = require("table.clone"),
|
||||
isarray = require("table.isarray"),
|
||||
empty_tab = {},
|
||||
}
|
||||
|
||||
|
||||
|
@ -25,7 +25,6 @@ local type = type
|
||||
local local_plugins = core.table.new(32, 0)
|
||||
local ngx = ngx
|
||||
local tostring = tostring
|
||||
local error = error
|
||||
local local_plugins_hash = core.table.new(0, 32)
|
||||
local stream_local_plugins = core.table.new(32, 0)
|
||||
local stream_local_plugins_hash = core.table.new(0, 32)
|
||||
@ -392,21 +391,6 @@ end
|
||||
|
||||
function _M.init_worker()
|
||||
_M.load()
|
||||
|
||||
local plugin_metadatas, err = core.config.new("/plugin_metadata",
|
||||
{automatic = true}
|
||||
)
|
||||
if not plugin_metadatas then
|
||||
error("failed to create etcd instance for fetching /plugin_metadatas : "
|
||||
.. err)
|
||||
end
|
||||
|
||||
_M.plugin_metadatas = plugin_metadatas
|
||||
end
|
||||
|
||||
|
||||
function _M.plugin_metadata(name)
|
||||
return _M.plugin_metadatas:get(name)
|
||||
end
|
||||
|
||||
|
||||
|
@ -14,25 +14,16 @@
|
||||
-- See the License for the specific language governing permissions and
|
||||
-- limitations under the License.
|
||||
--
|
||||
|
||||
local core = require("apisix.core")
|
||||
local log_util = require("apisix.utils.log-util")
|
||||
local batch_processor = require("apisix.utils.batch-processor")
|
||||
local log_util = require("apisix.utils.log-util")
|
||||
local core = require("apisix.core")
|
||||
local http = require("resty.http")
|
||||
local url = require("net.url")
|
||||
local plugin = require("apisix.plugin")
|
||||
local ngx = ngx
|
||||
local tostring = tostring
|
||||
local pairs = pairs
|
||||
local ipairs = ipairs
|
||||
|
||||
|
||||
local plugin_name = "http-logger"
|
||||
local ngx = ngx
|
||||
local tostring = tostring
|
||||
local http = require "resty.http"
|
||||
local url = require "net.url"
|
||||
local buffers = {}
|
||||
local lru_log_format = core.lrucache.new({
|
||||
ttl = 300, count = 512
|
||||
})
|
||||
|
||||
local ipairs = ipairs
|
||||
|
||||
local schema = {
|
||||
type = "object",
|
||||
@ -54,24 +45,11 @@ local schema = {
|
||||
}
|
||||
|
||||
|
||||
local metadata_schema = {
|
||||
type = "object",
|
||||
properties = {
|
||||
log_format = {
|
||||
type = "object",
|
||||
default = {},
|
||||
},
|
||||
},
|
||||
additionalProperties = false,
|
||||
}
|
||||
|
||||
|
||||
local _M = {
|
||||
version = 0.1,
|
||||
priority = 410,
|
||||
name = plugin_name,
|
||||
schema = schema,
|
||||
metadata_schema = metadata_schema,
|
||||
}
|
||||
|
||||
|
||||
@ -139,51 +117,8 @@ local function send_http_data(conf, log_message)
|
||||
end
|
||||
|
||||
|
||||
local function gen_log_format(metadata)
|
||||
local log_format = core.table.empty_tab
|
||||
if not metadata or
|
||||
not metadata.value or
|
||||
not metadata.value.log_format or
|
||||
core.table.nkeys(metadata.value.log_format) == 0
|
||||
then
|
||||
return log_format
|
||||
end
|
||||
|
||||
for k, var_name in pairs(metadata.value.log_format) do
|
||||
if var_name:sub(1, 1) == "$" then
|
||||
log_format[k] = {true, var_name:sub(2)}
|
||||
else
|
||||
log_format[k] = {false, var_name}
|
||||
end
|
||||
end
|
||||
core.log.info("log_format: ", core.json.delay_encode(log_format))
|
||||
return log_format
|
||||
end
|
||||
|
||||
|
||||
function _M.log(conf, ctx)
|
||||
local metadata = plugin.plugin_metadata(plugin_name)
|
||||
core.log.info("metadata: ", core.json.delay_encode(metadata))
|
||||
|
||||
local entry
|
||||
local log_format = lru_log_format(metadata or "", nil, gen_log_format,
|
||||
metadata)
|
||||
if log_format ~= core.table.empty_tab then
|
||||
entry = core.table.new(0, core.table.nkeys(log_format))
|
||||
for k, var_attr in pairs(log_format) do
|
||||
if var_attr[1] then
|
||||
entry[k] = ctx.var[var_attr[2]]
|
||||
else
|
||||
entry[k] = var_attr[2]
|
||||
end
|
||||
end
|
||||
local matched_route = ctx.matched_route and ctx.matched_route.value
|
||||
|
||||
entry.service_id = matched_route.service_id
|
||||
entry.route_id = matched_route.id
|
||||
else
|
||||
entry = log_util.get_full_log(ngx, conf)
|
||||
end
|
||||
function _M.log(conf)
|
||||
local entry = log_util.get_full_log(ngx, conf)
|
||||
|
||||
if not entry.route_id then
|
||||
core.log.error("failed to obtain the route id for http logger")
|
||||
|
@ -1025,7 +1025,7 @@ local function init_etcd(show_output)
|
||||
for _, dir_name in ipairs({"/routes", "/upstreams", "/services",
|
||||
"/plugins", "/consumers", "/node_status",
|
||||
"/ssl", "/global_rules", "/stream_routes",
|
||||
"/proto", "/plugin_metadata"}) do
|
||||
"/proto"}) do
|
||||
local key = (etcd_conf.prefix or "") .. dir_name .. "/"
|
||||
|
||||
local base64_encode = require("base64").encode
|
||||
|
@ -51,7 +51,7 @@
|
||||
|
||||
## 如何开启
|
||||
|
||||
这是有关如何为特定路由启用 http-logger 插件的示例。
|
||||
1. 这是有关如何为特定路由启用 http-logger 插件的示例。
|
||||
|
||||
```shell
|
||||
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
|
||||
@ -82,32 +82,6 @@ HTTP/1.1 200 OK
|
||||
hello, world
|
||||
```
|
||||
|
||||
## 插件元数据设置
|
||||
|
||||
| 名称 | 类型 | 必选项 | 默认值 | 有效值 | 描述 |
|
||||
| ---------------- | ------- | ------ | ------------- | ------- | ------------------------------------------------ |
|
||||
| log_format | object | 可选 | | | 以 Hash 对象方式声明日志格式。对 value 部分,仅支持字符串。如果是以`$`开头,则表明是要获取 [Nginx 内置变量](http://nginx.org/en/docs/varindex.html)。特别的,该设置是全局生效的,意味着指定 log_format 后,将对所有绑定 http-logger 的 Route 或 Service 生效。 |
|
||||
|
||||
### 设置日志格式示例
|
||||
|
||||
```shell
|
||||
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/http-logger -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
|
||||
{
|
||||
"log_format": {
|
||||
"host": "$host",
|
||||
"@timestamp": "$time_iso8601",
|
||||
"client_ip": "$remote_addr"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
在日志收集处,将得到类似下面的日志:
|
||||
|
||||
```shell
|
||||
{"host":"localhost","@timestamp":"2020-09-23T19:05:05-04:00","client_ip":"127.0.0.1","route_id":"1"}
|
||||
{"host":"localhost","@timestamp":"2020-09-23T19:05:05-04:00","client_ip":"127.0.0.1","route_id":"1"}
|
||||
```
|
||||
|
||||
## 禁用插件
|
||||
|
||||
在插件配置中删除相应的 json 配置以禁用 http-logger。APISIX 插件是热重载的,因此无需重新启动 APISIX:
|
||||
|
@ -43,7 +43,7 @@ __DATA__
|
||||
"upstream": {
|
||||
"nodes": {
|
||||
"127.0.0.1:1980": 1,
|
||||
"apple.com:80": 0
|
||||
"baidu.com:80": 0
|
||||
},
|
||||
"type": "roundrobin"
|
||||
},
|
||||
@ -89,4 +89,4 @@ hello world
|
||||
--- no_error_log
|
||||
[error]
|
||||
--- error_log eval
|
||||
qr/dns resolver domain: apple.com to \d+.\d+.\d+.\d+/
|
||||
qr/dns resolver domain: baidu.com to \d+.\d+.\d+.\d+/
|
||||
|
@ -37,7 +37,7 @@ __DATA__
|
||||
"upstream": {
|
||||
"nodes": {
|
||||
"127.0.0.1:1980": 1,
|
||||
"apple.com:80": 0
|
||||
"baidu.com:80": 0
|
||||
},
|
||||
"type": "roundrobin"
|
||||
},
|
||||
@ -79,7 +79,7 @@ hello world
|
||||
--- no_error_log
|
||||
[error]
|
||||
--- error_log eval
|
||||
qr/dns resolver domain: apple.com to \d+.\d+.\d+.\d+/
|
||||
qr/dns resolver domain: baidu.com to \d+.\d+.\d+.\d+/
|
||||
|
||||
|
||||
|
||||
@ -97,7 +97,7 @@ qr/dns resolver domain: apple.com to \d+.\d+.\d+.\d+/
|
||||
},
|
||||
"type": "roundrobin",
|
||||
"pass_host": "rewrite",
|
||||
"upstream_host": "httpbin.org"
|
||||
"upstream_host": "httpbin.org"
|
||||
},
|
||||
"uri": "/uri"
|
||||
}]]
|
||||
|
@ -1,147 +0,0 @@
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership.
|
||||
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
# (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
use t::APISIX 'no_plan';
|
||||
|
||||
log_level('info');
|
||||
repeat_each(1);
|
||||
no_long_string();
|
||||
no_root_location();
|
||||
|
||||
run_tests;
|
||||
|
||||
__DATA__
|
||||
|
||||
=== TEST 1: add plugin metadata
|
||||
--- config
|
||||
location /t {
|
||||
content_by_lua_block {
|
||||
local t = require("lib.test_admin").test
|
||||
local code, body = t('/apisix/admin/plugin_metadata/http-logger',
|
||||
ngx.HTTP_PUT,
|
||||
[[{
|
||||
"log_format": {
|
||||
"host": "$host",
|
||||
"@timestamp": "$time_iso8601",
|
||||
"client_ip": "$remote_addr"
|
||||
}
|
||||
}]],
|
||||
[[{
|
||||
"node": {
|
||||
"value": {
|
||||
"log_format": {
|
||||
"host": "$host",
|
||||
"@timestamp": "$time_iso8601",
|
||||
"client_ip": "$remote_addr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": "set"
|
||||
}]]
|
||||
)
|
||||
|
||||
ngx.status = code
|
||||
ngx.say(body)
|
||||
}
|
||||
}
|
||||
--- request
|
||||
GET /t
|
||||
--- response_body
|
||||
passed
|
||||
--- no_error_log
|
||||
[error]
|
||||
|
||||
|
||||
|
||||
=== TEST 2: sanity, batch_max_size=1
|
||||
--- config
|
||||
location /t {
|
||||
content_by_lua_block {
|
||||
local t = require("lib.test_admin").test
|
||||
local code, body = t('/apisix/admin/routes/1',
|
||||
ngx.HTTP_PUT,
|
||||
[[{
|
||||
"plugins": {
|
||||
"http-logger": {
|
||||
"uri": "http://127.0.0.1:1980/log",
|
||||
"batch_max_size": 1,
|
||||
"max_retry_count": 1,
|
||||
"retry_delay": 2,
|
||||
"buffer_duration": 2,
|
||||
"inactive_timeout": 2,
|
||||
"concat_method": "new_line"
|
||||
}
|
||||
},
|
||||
"upstream": {
|
||||
"nodes": {
|
||||
"127.0.0.1:1982": 1
|
||||
},
|
||||
"type": "roundrobin"
|
||||
},
|
||||
"uri": "/hello"
|
||||
}]]
|
||||
)
|
||||
|
||||
if code >= 300 then
|
||||
ngx.status = code
|
||||
end
|
||||
ngx.say(body)
|
||||
}
|
||||
}
|
||||
--- request
|
||||
GET /t
|
||||
--- response_body
|
||||
passed
|
||||
--- no_error_log
|
||||
[error]
|
||||
|
||||
|
||||
|
||||
=== TEST 3: hit route and report http logger
|
||||
--- request
|
||||
GET /hello
|
||||
--- response_body
|
||||
hello world
|
||||
--- wait: 0.5
|
||||
--- no_error_log
|
||||
[error]
|
||||
--- error_log
|
||||
request log: {
|
||||
|
||||
|
||||
|
||||
=== TEST 4: remove plugin metadata
|
||||
--- config
|
||||
location /t {
|
||||
content_by_lua_block {
|
||||
local t = require("lib.test_admin").test
|
||||
local code, body = t('/apisix/admin/plugin_metadata/http-logger',
|
||||
ngx.HTTP_DELETE
|
||||
)
|
||||
|
||||
if code >= 300 then
|
||||
ngx.status = code
|
||||
end
|
||||
|
||||
ngx.say(body)
|
||||
}
|
||||
}
|
||||
--- request
|
||||
GET /t
|
||||
--- response_body
|
||||
passed
|
||||
--- no_error_log
|
||||
[error]
|
Loading…
Reference in New Issue
Block a user