Skip to main content
Version: 2.8.1

Database Log

Database Log

用途說明#

儲存請求及回應日誌至資料庫中的 logs table內。

注意

不建議使用此插件來儲存所有日誌紀錄, table 內資料過多會造成 DB 效能之負擔,此插件較適用於驗證小量日誌時使用(可善用插件的 啟用/禁用 功能來做小量驗證。)

且目前針對非 JSON 格式的 API response,在儲存至 table 內時可能會因為編碼問題造成寫入失敗,是 database-log 目前使用上的限制。

logs table schema架構如下:

欄位名稱類型說明
idvarchar(50)每一筆日誌的 id。
requestlongtext請求相關紀錄,包含標頭、參數等等。
request_api_hosttext請求時帶入之 x-api-host 標頭的值。
request_api_keytext請求時帶入之 x-api-key 標頭的值。
responselongtext回應相關紀錄,包含標頭、參數等等。
response_timedouble回應花費時間(以秒為單位)。
response_statusint回應狀態碼。
other_infolongtext其餘相關資訊,例如當前匹配之服務、路由設定之資訊等等。
service_idvarchar(50)匹配的服務id。
route_idvarchar(50)匹配的路由id。
created_attimestamp(3)日誌記錄創立時間。

日誌格式請參考下方:日誌格式

欄位配置說明#

啟用時可以看到以下畫面:

插件啟用配置圖

對應的配置說明如下:

參數類型預設值說明必填
hide_bodybooleanfalse設為 true:隱藏回應的 body 內容,不會將 body 內容記錄到日誌內。
設為 false:會將 body 內容記錄到日誌內。
hide_trace_recordbooleantrue注意:僅有在 (1) 測試及偵錯 功能所發送的請求,或者是 (2) 發送請求的時候加上 Debug-Enabled: true 的 header,才會紀錄該次請求運行的插件詳細資訊。
設為 true :隱藏該次請求會運行的插件詳細資訊,不記錄到日誌內。
設為 false:將該次請求會運行的插件詳細資訊,一併記錄到日誌內。
clear_headerbooleantrue設為 true :開啟過濾 header 的功能。
設為 false:關閉過濾 header 的功能。
clear_request_header_listarray of string定義不紀錄到日誌中的請求標頭
例如: Content-Type ...等。沒設定代表所有請求標頭都會記錄於日誌中。
注意:當 clear_header 設定為 true ,才會觸發此設定。
clear_response_header_listarray of string定義不紀錄到日誌中的回應標頭,定義不紀錄到日誌中的請求標頭
例如:Content-Type ...等。沒設定代表所有請求標頭都會記錄於日誌中。
注意:當 clear_header 設定為 true ,才會觸發此設定。

用法示例#

日誌格式#

日誌使用 JSON 的格式來組成,說明如下:

  • request 包含有關客戶端發送的請求。
  • response 包含發送給客戶端的回應。
  • tries 包含負載均衡器對此請求進行的(成功和失敗)列表。
  • route 包含請求所對應之特定的 GOC API Gateway 路由設定資料。
  • service 包含請求所對應之 GOC API Gateway 路由關聯的服務設定資料。
  • authenticated_entity 如果已啟動身份認證插件,則會包含認證憑據。
  • workspaces 包含與請求的路由所屬的工作區資料。目前版本的 services 及 routes 資訊內的 ws_id 欄位會對應其所屬的 workspace ID 資訊。
  • consumer 如果已啟動身份認證插件,則會包含認證的用戶設定資料。
  • latencies 包含有關延遲的一些數據:
    • proxy 是最終服務處理請求所花費的時間。
    • kong 是運行所有插件所需的內部延遲。
    • request 是從客戶端讀取第一個字節到將最後一個字節發送到客戶端之間經過的時間。對於檢測速度較慢的客戶端很有用。
  • client_ip 包含原始客戶端 IP 地址。
  • started_at 包含開始處理請求的時間的 UTC 時區時戳。

範例:

{
"latencies": {
"request": 515,
"kong": 58,
"proxy": 457
},
"service": {
"host": "httpbin.org",
"created_at": 1614232642,
"connect_timeout": 60000,
"id": "167290ee-c682-4ebf-bdea-e49a3ac5e260",
"protocol": "http",
"read_timeout": 60000,
"port": 80,
"path": "/anything",
"updated_at": 1614232642,
"write_timeout": 60000,
"retries": 5,
"ws_id": "54baa5a9-23d6-41e0-9c9a-02434b010b25"
},
"request": {
"querystring": {},
"size": 138,
"uri": "/log",
"url": "http://localhost:8000/log",
"headers": {
"host": "localhost:8000",
"accept-encoding": "gzip, deflate",
"user-agent": "HTTPie/2.4.0",
"accept": "*/*",
"connection": "keep-alive"
},
"method": "GET"
},
"tries": [
{
"balancer_latency": 0,
"port": 80,
"balancer_start": 1614232668399,
"ip": "18.211.130.98"
}
],
"client_ip": "192.168.144.1",
"upstream_uri": "/anything",
"response": {
"headers": {
"content-type": "application/json",
"date": "Thu, 25 Feb 2021 05:57:48 GMT",
"connection": "close",
"access-control-allow-credentials": "true",
"content-length": "503",
"server": "gunicorn/19.9.0",
"via": "kong/2.2.1.0-enterprise-edition",
"x-kong-proxy-latency": "57",
"x-kong-upstream-latency": "457",
"access-control-allow-origin": "*"
},
"status": 200,
"size": 827,
"body": "[{\"id\":\"2513b24e-21da-4c8a-ae41-26c1e5c96bcd\",\"username\":\"demo222\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo222\",\"create_time\":\"2020-08-21T08:55:28Z\"},{\"id\":\"25a52372-c8ce-4d02-b175-7eae8ee18ad1\",\"username\":\"jop\",\"email\":\"j.op@aaa.com\",\"display_name\":\"jop\",\"create_time\":\"2020-09-22T01:53:04Z\"},{\"id\":\"2e9c4445-e07d-4154-82c1-20eaee12a610\",\"username\":\"ginatest\",\"email\":\"gina_test@gmail.com\",\"display_name\":\"ginatest\",\"create_time\":\"2021-03-04T07:54:44Z\"},{\"id\":\"5be08e00-b228-47a4-b0da-4d4a969644d8\",\"username\":\"edward_op\",\"email\":\"edward_op@geminiopencloud.com\",\"display_name\":\"edward_op\",\"create_time\":\"2020-08-25T01:29:20Z\"},{\"id\":\"621cd187-501e-41ff-8816-23f36c29e434\",\"username\":\"gina_t_admin\",\"email\":\"gina_t_admin@gmail.com\",\"display_name\":\"gina_t_admin\",\"create_time\":\"2021-03-05T08:34:03Z\"},{\"id\":\"6c25fead-0ba0-45a3-aaf0-9c99ab6fc0cc\",\"username\":\"jdev\",\"email\":\"j.dev@aaa.com\",\"display_name\":\"jdev\",\"create_time\":\"2020-09-22T01:53:55Z\"},{\"id\":\"7408346a-67af-4a2f-8946-e72a218b6bfc\",\"username\":\"demo_dp\",\"email\":\"developerA@geminiopencloud.com\",\"display_name\":\"developer A\",\"create_time\":\"2020-07-15T03:32:25Z\"},{\"id\":\"7aa7a143-ad49-4347-8445-cf0c5ad0375a\",\"username\":\"demo444\",\"email\":\"demo444@xxx.com\",\"display_name\":\"demo444\",\"create_time\":\"2020-08-24T05:53:48Z\"},{\"id\":\"7dfec1f1-2522-458b-be71-2456c50bf9bf\",\"username\":\"tim_op2\",\"email\":\"eer\",\"display_name\":\"tim_op2\",\"create_time\":\"2020-08-28T07:50:22Z\"},{\"id\":\"87878787-afb8-11ea-8686-0bb5c49d8beb\",\"username\":\"ryyua\",\"email\":\"ryyua@geminiopencloud.com\",\"display_name\":\"Greg\",\"create_time\":\"2020-06-16T10:05:41Z\"},{\"id\":\"914a4f02-ef8b-43d9-b355-e761537f5a08\",\"username\":\"yee\",\"email\":\"yee@goc.com\",\"display_name\":\"yee\",\"create_time\":\"2020-07-14T07:56:14Z\"},{\"id\":\"aa60fef9-4122-4ebc-8c3d-17761e86e9fa\",\"username\":\"demo_op3\",\"email\":\"demo_op3@geminiopencloud.com\",\"display_name\":\"demo_op3\",\"create_time\":\"2020-08-24T09:46:03Z\"},{\"id\":\"ab87fdca-34c3-484c-8963-68020e055766\",\"username\":\"test08182\",\"email\":\"xxx@xxx.com\",\"display_name\":\"test08182\",\"create_time\":\"2020-08-18T09:04:36Z\"},{\"id\":\"admin\",\"username\":\"admin\",\"email\":\"admin@demo.com\",\"display_name\":\"Admin\",\"create_time\":\"2020-06-16T08:00:52Z\"},{\"id\":\"b516b2a7-67dd-431d-8b6d-8ad9bdfab521\",\"username\":\"devops_test\",\"email\":\"test@geminiopencloud.com\",\"display_name\":\"test\",\"create_time\":\"2020-07-14T08:00:08Z\"},{\"id\":\"bab476a1-d1bc-42a3-9a39-655608fdd056\",\"username\":\"test_aaa\",\"email\":\"xxx@xxx.com\",\"display_name\":\"aaa\",\"create_time\":\"2020-08-13T03:31:50Z\"},{\"id\":\"c0de1458-a781-4cfa-a278-6c28fccee882\",\"username\":\"tim_dp\",\"email\":\"tim_dp@geminiopencloude.com\",\"display_name\":\"tim_dp\",\"create_time\":\"2020-08-26T01:29:30Z\"},{\"id\":\"cabd94a0-a6a9-456b-bb72-34135852212b\",\"username\":\"yee_test\",\"email\":\"yee@geminiopencloud.com\",\"display_name\":\"kimochi~yee\",\"create_time\":\"2020-07-13T02:38:12Z\"},{\"id\":\"dbcabbc6-56af-417a-b938-01efd871f77c\",\"username\":\"demo111\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo111\",\"create_time\":\"2020-08-21T08:54:37Z\"},{\"id\":\"e0feef08-5282-4de6-ba35-9a724e55b68f\",\"username\":\"demo333\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo333\",\"create_time\":\"2020-08-21T09:03:21Z\"},{\"id\":\"e6ec26e9-1c93-47b0-8a33-e35c3176aa68\",\"username\":\"tim_op\",\"email\":\"tim_op@geminiopencloud,com\",\"display_name\":\"tim_op\",\"create_time\":\"2020-08-26T01:30:13Z\"},{\"id\":\"eefbb2fb-0dd6-4f70-a5be-9660f385a387\",\"username\":\"edward_dp\",\"email\":\"edward_dp@geminiopencloud.com\",\"display_name\":\"edward_dp\",\"create_time\":\"2020-08-25T01:29:10Z\"},{\"id\":\"f6c3349e-379b-49ca-82e9-272787537d38\",\"username\":\"demo_op\",\"email\":\"operatorA@geminiopencloud.com\",\"display_name\":\"Operator A\",\"create_time\":\"2020-07-15T03:23:32Z\"}]"
},
"route": {
"id": "78f79740-c410-4fd9-a998-d0a60a99dc9b",
"paths": [
"/log"
],
"protocols": [
"http"
],
"strip_path": true,
"created_at": 1614232648,
"ws_id": "54baa5a9-23d6-41e0-9c9a-02434b010b25",
"request_buffering": true,
"updated_at": 1614232648,
"preserve_host": false,
"regex_priority": 0,
"response_buffering": true,
"https_redirect_status_code": 426,
"path_handling": "v0",
"service": {
"id": "167290ee-c682-4ebf-bdea-e49a3ac5e260"
}
},
"started_at": 1614232668342
}

在全局啟用插件#

  1. 從網站左邊 Menu 中 外掛插件 頁面中,點選右上角的 新增外掛插件

全局啟用畫面

  1. 點選後,選擇 日誌 頁籤,並啟用 Database Log,填寫內容參考欄位配置說明,設定成功後,任何請求(不分服務、路由、用戶)的日誌都會儲存到 logs table 內。

在服務端上啟用插件#

  1. 從網站左邊 Menu 中 服務 > 服務列表 頁面中,選擇要啟用此插件的服務,假設為 google,點選對應的編輯按鈕:

服務啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

服務啟用畫面2

點選後,選擇 日誌 頁籤,並啟用 Database Log,填寫內容參考欄位配置說明,設定成功後,僅有此服務(範例為google)請求的日誌會儲存到 logs table 內。

在路由端上啟用插件#

可以由兩種方式來選擇路由,並啟用插件:

方式一:路由列表#

  1. 從網站左邊 Menu 中 服務 > 路由列表 頁面中,選擇要啟用此插件的路由,假設為 google,點選對應的編輯按鈕:

路由啟用畫面1

方式二:服務 > 服務列表 > 路由列表#

  1. 從網站左邊 Menu 中 服務 > 服務列表 頁面中,選擇要啟用此插件的路由 所屬之服務(假設為 google),點選對應的編輯按鈕。

在編輯畫面中,點選上方的 路由 頁籤,選擇要啟用此插件的路由(假設為 google),點選對應的編輯按鈕:

路由啟用畫面2


  1. 承第1步,點擊上述兩種方式之一的編輯按鈕後,在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

路由啟用畫面3

點選新增外掛插件 按鈕後,選擇 日誌 頁籤,並啟用 Database Log,填寫內容參考欄位配置說明,設定成功後,僅有此路由(範例為google)請求的日誌會儲存到 logs table 內。

在用戶端上啟用插件#

  1. 從網站左邊 Menu 中 訂閱用戶 > 用戶列表 頁面中,選擇要啟用此插件的用戶,假設為 portaladmin,點選對應的編輯按鈕:

用戶啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

用戶啟用畫面2

點選後,選擇 日誌 頁籤,並啟用 Database Log,填寫內容參考欄位配置說明,設定成功後,僅有此用戶(範例為 portaladmin)請求的日誌會儲存到 logs table 內。

驗證#

透過 GOC API Gateway 去呼叫服務,範例如下(使用 curl 命令來測試):

curl -XGET < GOC API Gateway protocol>://< GOC API Gateway ip>:< GOC API Gateway port>/api/v2/users/ \
-H 'X-API-HOST: gocv3' \
-H 'X-API-KEY: 7338ebd5-a29c-469a-8501-ad861e1821c8' \
-uadmin:password -i
HTTP/1.1 200 OK
[{"id":"2513b24e-21da-4c8a-ae41-26c1e5c96bcd","username":"demo222","email":"xxx@xxx.com","display_name":"demo222","create_time":"2020-08-21T08:55:28Z"},{"id":"25a52372-c8ce-4d02-b175-7eae8ee18ad1","username":"jop","email":"j.op@aaa.com"...()

GOC API Gateway 在取得服務的回應後,會將該次的請求 & 回應之日誌,寫入對應之 logs table 內。

檢視 logs table 內的紀錄,若類似如下,即代表啟用成功。

MariaDB [lunar]> select * from logs order by created_at desc limit 1\G;
*************************** 1. row ***************************
id: 9e0a795e-a8ff-4570-b08d-c40280a41842
request: {"querystring":{},"size":149,"uri":"/api/v2/users/","timestamp":1617870208.281,"url":"http://localhost:8000/api/v2/users/","headers":{"host":"localhost:9000","authorization":"Basic YWRtaW46YWRtaW4=","user-agent":"curl/7.65.3","accept":"*/*","x-api-host":"gocv3"},"body":"","method":"GET"}
request_api_host: gocv3
request_api_key:
response: {"response_time":0.131,"size":4583,"body":"[{\"id\":\"2513b24e-21da-4c8a-ae41-26c1e5c96bcd\",\"username\":\"demo222\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo222\",\"create_time\":\"2020-08-21T08:55:28Z\"},{\"id\":\"25a52372-c8ce-4d02-b175-7eae8ee18ad1\",\"username\":\"jop\",\"email\":\"j.op@aaa.com\",\"display_name\":\"jop\",\"create_time\":\"2020-09-22T01:53:04Z\"},{\"id\":\"2e9c4445-e07d-4154-82c1-20eaee12a610\",\"username\":\"ginatest\",\"email\":\"gina_test@gmail.com\",\"display_name\":\"ginatest\",\"create_time\":\"2021-03-04T07:54:44Z\"},{\"id\":\"5be08e00-b228-47a4-b0da-4d4a969644d8\",\"username\":\"edward_op\",\"email\":\"edward_op@geminiopencloud.com\",\"display_name\":\"edward_op\",\"create_time\":\"2020-08-25T01:29:20Z\"},{\"id\":\"621cd187-501e-41ff-8816-23f36c29e434\",\"username\":\"gina_t_admin\",\"email\":\"gina_t_admin@gmail.com\",\"display_name\":\"gina_t_admin\",\"create_time\":\"2021-03-05T08:34:03Z\"},{\"id\":\"6c25fead-0ba0-45a3-aaf0-9c99ab6fc0cc\",\"username\":\"jdev\",\"email\":\"j.dev@aaa.com\",\"display_name\":\"jdev\",\"create_time\":\"2020-09-22T01:53:55Z\"},{\"id\":\"7408346a-67af-4a2f-8946-e72a218b6bfc\",\"username\":\"demo_dp\",\"email\":\"developerA@geminiopencloud.com\",\"display_name\":\"developer A\",\"create_time\":\"2020-07-15T03:32:25Z\"},{\"id\":\"7aa7a143-ad49-4347-8445-cf0c5ad0375a\",\"username\":\"demo444\",\"email\":\"demo444@xxx.com\",\"display_name\":\"demo444\",\"create_time\":\"2020-08-24T05:53:48Z\"},{\"id\":\"7dfec1f1-2522-458b-be71-2456c50bf9bf\",\"username\":\"tim_op2\",\"email\":\"eer\",\"display_name\":\"tim_op2\",\"create_time\":\"2020-08-28T07:50:22Z\"},{\"id\":\"87878787-afb8-11ea-8686-0bb5c49d8beb\",\"username\":\"ryyua\",\"email\":\"ryyua@geminiopencloud.com\",\"display_name\":\"Greg\",\"create_time\":\"2020-06-16T10:05:41Z\"},{\"id\":\"914a4f02-ef8b-43d9-b355-e761537f5a08\",\"username\":\"yee\",\"email\":\"yee@goc.com\",\"display_name\":\"yee\",\"create_time\":\"2020-07-14T07:56:14Z\"},{\"id\":\"aa60fef9-4122-4ebc-8c3d-17761e86e9fa\",\"username\":\"demo_op3\",\"email\":\"demo_op3@geminiopencloud.com\",\"display_name\":\"demo_op3\",\"create_time\":\"2020-08-24T09:46:03Z\"},{\"id\":\"ab87fdca-34c3-484c-8963-68020e055766\",\"username\":\"test08182\",\"email\":\"xxx@xxx.com\",\"display_name\":\"test08182\",\"create_time\":\"2020-08-18T09:04:36Z\"},{\"id\":\"admin\",\"username\":\"admin\",\"email\":\"admin@demo.com\",\"display_name\":\"Admin\",\"create_time\":\"2020-06-16T08:00:52Z\"},{\"id\":\"b516b2a7-67dd-431d-8b6d-8ad9bdfab521\",\"username\":\"devops_test\",\"email\":\"test@geminiopencloud.com\",\"display_name\":\"test\",\"create_time\":\"2020-07-14T08:00:08Z\"},{\"id\":\"bab476a1-d1bc-42a3-9a39-655608fdd056\",\"username\":\"test_aaa\",\"email\":\"xxx@xxx.com\",\"display_name\":\"aaa\",\"create_time\":\"2020-08-13T03:31:50Z\"},{\"id\":\"c0de1458-a781-4cfa-a278-6c28fccee882\",\"username\":\"tim_dp\",\"email\":\"tim_dp@geminiopencloude.com\",\"display_name\":\"tim_dp\",\"create_time\":\"2020-08-26T01:29:30Z\"},{\"id\":\"cabd94a0-a6a9-456b-bb72-34135852212b\",\"username\":\"yee_test\",\"email\":\"yee@geminiopencloud.com\",\"display_name\":\"kimochi~yee\",\"create_time\":\"2020-07-13T02:38:12Z\"},{\"id\":\"dbcabbc6-56af-417a-b938-01efd871f77c\",\"username\":\"demo111\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo111\",\"create_time\":\"2020-08-21T08:54:37Z\"},{\"id\":\"e0feef08-5282-4de6-ba35-9a724e55b68f\",\"username\":\"demo333\",\"email\":\"xxx@xxx.com\",\"display_name\":\"demo333\",\"create_time\":\"2020-08-21T09:03:21Z\"},{\"id\":\"e6ec26e9-1c93-47b0-8a33-e35c3176aa68\",\"username\":\"tim_op\",\"email\":\"tim_op@geminiopencloud,com\",\"display_name\":\"tim_op\",\"create_time\":\"2020-08-26T01:30:13Z\"},{\"id\":\"eefbb2fb-0dd6-4f70-a5be-9660f385a387\",\"username\":\"edward_dp\",\"email\":\"edward_dp@geminiopencloud.com\",\"display_name\":\"edward_dp\",\"create_time\":\"2020-08-25T01:29:10Z\"},{\"id\":\"f6c3349e-379b-49ca-82e9-272787537d38\",\"username\":\"demo_op\",\"email\":\"operatorA@geminiopencloud.com\",\"display_name\":\"Operator A\",\"create_time\":\"2020-07-15T03:23:32Z\"}]","headers":{"content-type":"application/json","date":"Thu, 08 Apr 2021 08:23:28 GMT","connection":"close","via":"kong/2.3.3","x-kong-proxy-latency":"33","vary":["Accept,Accept-Language,Cookie","Origin"],"x-kong-upstream-latency":"96","access-control-allow-origin":"*","allow":"GET, POST, HEAD, OPTIONS","server":"Apache/2.4.7 (Ubuntu)","transfer-encoding":"chunked","x-frame-options":"SAMEORIGIN","content-language":"en"},"status":200,"timestamp":1617870208.412}
response_time: 0.131
response_status: 200
other_info: {"latencies":{"request":131,"kong":35,"proxy":96},"service":{"host":"10.15.40.14","created_at":1592296411,"connect_timeout":60000,"id":"6799854c-1e31-41b4-ac75-b5f55c4653a1","protocol":"https","name":"gocv3","read_timeout":60000,"port":443,"updated_at":1617867734,"tls_verify":false,"ws_id":"7ff04f2c-1024-456e-adb5-6fe0848a90ff","retries":5,"write_timeout":60000},"service_id":"6799854c-1e31-41b4-ac75-b5f55c4653a1","client_ip":"172.18.0.1","tries":[{"balancer_latency":0,"port":443,"balancer_start":1617870208314,"ip":"10.15.40.14"}],"route_id":"a9d3404d-15bf-481c-88ac-63bfdb522cd4","upstream_uri":"/api/v2/users/","route":{"id":"a9d3404d-15bf-481c-88ac-63bfdb522cd4","path_handling":"v0","updated_at":1617867734,"protocols":["http","https"],"created_at":1609211603,"ws_id":"7ff04f2c-1024-456e-adb5-6fe0848a90ff","request_buffering":false,"hosts":["gocv3"],"name":"gocv312","preserve_host":false,"regex_priority":0,"response_buffering":false,"service":{"id":"6799854c-1e31-41b4-ac75-b5f55c4653a1"},"https_redirect_status_code":426,"tags":["p1","p2"],"strip_path":false},"started_at":1617870208281}
service_id: 6799854c-1e31-41b4-ac75-b5f55c4653a1
route_id: a9d3404d-15bf-481c-88ac-63bfdb522cd4
created_at: 2021-04-08 16:23:28.419