diff --git a/apisix/core/table.lua b/apisix/core/table.lua index 23248408af8d..4ad92caa104d 100644 --- a/apisix/core/table.lua +++ b/apisix/core/table.lua @@ -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 = {}, } diff --git a/apisix/plugin.lua b/apisix/plugin.lua index c2d40ce5ab0f..8c498831ef05 100644 --- a/apisix/plugin.lua +++ b/apisix/plugin.lua @@ -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 diff --git a/apisix/plugins/http-logger.lua b/apisix/plugins/http-logger.lua index a483ab1c4dcb..4694b605fd55 100644 --- a/apisix/plugins/http-logger.lua +++ b/apisix/plugins/http-logger.lua @@ -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") diff --git a/bin/apisix b/bin/apisix index bab34c6890cd..342c0fc58fca 100755 --- a/bin/apisix +++ b/bin/apisix @@ -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 diff --git a/doc/zh-cn/plugins/http-logger.md b/doc/zh-cn/plugins/http-logger.md index 55694322272b..77910071cb79 100644 --- a/doc/zh-cn/plugins/http-logger.md +++ b/doc/zh-cn/plugins/http-logger.md @@ -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: diff --git a/t/node/route-domain-with-local-dns.t b/t/node/route-domain-with-local-dns.t index 650247e44538..d913c1d63d70 100644 --- a/t/node/route-domain-with-local-dns.t +++ b/t/node/route-domain-with-local-dns.t @@ -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+/ diff --git a/t/node/route-domain.t b/t/node/route-domain.t index 6ca1c017af31..6fbd31da4b13 100644 --- a/t/node/route-domain.t +++ b/t/node/route-domain.t @@ -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" }]] diff --git a/t/plugin/http-logger-log-format.t b/t/plugin/http-logger-log-format.t deleted file mode 100644 index d092eebba66f..000000000000 --- a/t/plugin/http-logger-log-format.t +++ /dev/null @@ -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]