配置針對的是集群中所有機器,注意保持集群各個服務器設置日志保持統一。
一、配置步驟
1.打開clickhouse的users.xml文件,在profiles中加入<log_queries>1</log_queries>
2.打開config.xml文件,在yandex中加入query_log的配置
<query_log> <database>system</database> <table>query_log</table> <partition_by>toYYYYMM(event_date)</partition_by> <flush_interval_milliseconds>7500</flush_interval_milliseconds> </query_log>
如添加上述參數之后表不自動創建,重啟clickhouse-server服務即可。
partition_by表示查詢日志表的分區列,語法與普通建表時相同,默認按月分區。flush_interval_milliseconds則表示日志刷入表中的周期,默認7.5秒,可以根據取數時效自己調節。
3.配置一個分布式表,用來外部查詢
CREATE TABLE IF NOT EXISTS system.query_log_all ON CLUSTER yk_ck_cluster AS system.query_log ENGINE = Distributed(yk_ck_cluster,system,query_log,rand())
4.配置過期TTL
由於query_log表沒有自動清理功能,為了防止日志表過大占用太多的內存,設置一個自動清理表數據的TTL。
ALTER TABLE system.query_log on cluster yk_ck_cluster MODIFY TTL event_date + INTERVAL 15 DAY
二、query_log內容介紹
1.system.query_log注冊了兩種查詢:
1)由客戶端直接運行的初始查詢。
2)由其他查詢發起的子查詢(分布式查詢執行)。對於這些類型的查詢,有關父查詢的信息顯示在initial_*列中。
2.每個查詢會在query_log表中創建1-2行,取決於查詢的狀態:
1)如果查詢執行成功,將創建兩個類型為1和2的事件(參考type列)。
2)如果查詢處理過程中發生錯誤,將創建兩個類型為1和4的事件。
3)如果查詢運行前發生錯誤,將只創建一個類型為3的事件。
3.默認情況下,每隔7.5秒向表添加一次日志。可以在query_log服務器設置中設置這個時間間隔(參考flush_interval_milliseconds參數)。要將日志從內存緩沖區強制刷新到表中,可以使用SYSTEM FLUSH LOGS。
列信息介紹:
type (Enum8) — 執行查詢時發生的事件類型。 ‘QueryStart’ = 1 — 查詢執行成功開始。 ‘QueryFinish’ = 2 — 查詢執行成功結束。 ‘ExceptionBeforeStart’ = 3 — 在開始執行查詢之前發生異常。 ‘ExceptionWhileProcessing’ = 4 — 查詢執行期間的異常。 event_date (Date) — 查詢開始日期。 event_time (DateTime) — 查詢開始時間。 query_start_time (DateTime) — 查詢執行開始時間。 query_duration_ms (UInt64) — 查詢執行持續時間。 read_rows (UInt64) — 讀取的行數。 read_bytes (UInt64) — 讀取的字節數。 written_rows (UInt64) — 對於插入查詢,寫入的行數。對於其他查詢,值為0。 written_bytes (UInt64) — 對於插入查詢,寫入的字節數。對於其他查詢,值為0。 result_rows (UInt64) — 結果中的行數。 result_bytes (UInt64) — 結果中的字節數。 memory_usage (UInt64) — 查詢消耗的內存。 query (String) — 查詢字符串。 exception (String) — 異常信息。 stack_trace (String) — 堆棧調用信息(在發生錯誤之前調用的方法列表)。如果查詢成功完成,則為空字符串。 is_initial_query (UInt8) — 查詢類型。可能的取值: 1 — 查詢由客戶端發起。 0 — 查詢由另一個查詢發起,用於分布式查詢執行。 user (String) — 發起當前查詢的用戶的名稱。 query_id (String) — 查詢ID。 address (IPv6) — 發起查詢的IP地址。 port (UInt16) —發起行查詢的客戶端端口。 initial_user (String) — 運行初始查詢的用戶名(用於分布式查詢執行)。 initial_query_id (String) — 初始查詢的ID(用於分布式查詢執行)。 initial_address (IPv6) — 啟動父查詢的IP地址。 initial_port (UInt16) — 發起父查詢的客戶端端口。 interface (UInt8) — 發起查詢的接口。可能的取值: 1 — TCP 2 — HTTP os_user (String) — 運行clickhouse-client的操作系統的用戶名。 client_hostname (String) — 運行clickhouse-client或另一個TCP客戶端的客戶端機器的主機名。 client_name (String) — clickhouse-client或另一個TCP客戶端名稱。 client_revision (UInt32) — clickhouse-client或另一個TCP客戶端的修訂版。 client_version_major (UInt32) — lickhouse-client或另一個TCP客戶端的主要版本。 client_version_minor (UInt32) — lickhouse-client或另一個TCP客戶端的小版本。 client_version_patch (UInt32) — clickhouse-client或另一個TCP客戶端版本的補丁組件。 http_method (UInt8) — 發起查詢的HTTP方法。可能的取值: 0 — 查詢是從TCP接口啟動的。 1 — 使用GET方法。 2 — 采用POST方法。 http_user_agent (String) —在HTTP請求中傳遞的UserAgent請求頭。 quota_key (String) — 配額設置中指定的配額鍵。 revision (UInt32) — ClickHouse 修訂版。 thread_numbers (Array(UInt32)) — 參與查詢執行的線程數。 ProfileEvents.Names (Array(String)) — 測量不同指標的機器數。它們的描述可以在system.events表中找到 ProfileEvents.Values (Array(UInt64)) — 在ProfileEvents.Names 列中列出的指標值。 Settings.Names (Array(String)) — 客戶端運行查詢時更改的設置的名稱。要啟用對設置的日志記錄,將log_query_settings參數設置為1。 Settings.Values (Array(String)) —Settings.Names列中列出的設置的值。