1. 程式人生 > >Postgresql - 監控 moniter - 監控日誌

Postgresql - 監控 moniter - 監控日誌

監控日誌,之前介紹過一個第三方工具,pgbadger。非常的好用。

這次介紹其他的方法。1. 通過ELK監控日誌。2. 藉助filebeats,kafka,自己編寫的監控指令碼。

 

通過ELK監控日誌

說是監控日誌,其實ELK主要的功能是對檔案進行收集和統計。比如某個資料庫的錯,在一段時間出現的次數。

1. 首先搭建kafka,logstash,kibana,ElasticSearch服務。

此處省略。

2. 在每個資料庫伺服器中,配置filebeats讀取pg_log,併發送至kafka。

3. logstash作為kafka的消費者,讀取PGLOG日誌,並將日誌格式化。將格式化好的資料插入到elasticsearch。

4. 將kibana配置好,展示es中的內容。

這時,我們可以通過kibana,展示所有伺服器的pg log。延遲基本可以控制在1分鐘(這要看硬體配置和壓力大小)。我們30臺伺服器,平均每分鐘資料庫產生一萬行日誌。延遲基本可以保持在3--5秒內。

分享一下目前我們在使用的logstash解析日誌的匹配

LOGLEVEL (PANIC|FATAL|LOG|ERROR|WARNING|NOTICE|INFO|DEBUG|DETAIL|STATEMENT|HINT|CONTEXT)
ACTION (%{DATA}:)
DUR (\d+\.\d+)
PGIPORHOST (?:%{IPORHOST}|\[local\])
PGUSER (?:%{DATA})
PGPREFIX %{DATESTAMP:timestamp} %{WORD:TZ} \[%{NUMBER:processid}\]\: (?<sessionlinenumber>\[\d+\-\d+\]) user=%{DATA:dbuser},db=%{DATA:dbname}?(%{PGIPORHOST:agentip})? %{LOGLEVEL:loglevel}:
POSTGRES %{PGPREFIX}%{SPACE}?(((duration: ?(%{DUR:postgres_duration:float}) ms)%{SPACE}?%{ACTION}%{SPACE}%{GREEDYDATA:postgres_message})|((%{ACTION:action})?({SPACE})?%{GREEDYDATA:postgres_message}))

 

 

 

對日誌的監控。

因為ELK是對日誌的收集和統計,我自己藉助了kafka中的日誌訊息用python寫了一個對日誌的監控,當日單條錯誤大於20次時(只是針對於目前環境,針對於應用長時間報錯),傳送郵件告警。

1. 從kafka中讀取日誌。

2. 將日誌做匹配,只過濾出錯誤日誌。

3. 將錯誤日誌記錄到資料庫。

4. 當有錯誤日誌的時候,計算當日的錯誤數量,並記錄到統計表中。

5. 當日單個錯誤數量超過20個時,傳送告警。

6. 第二天將前日的錯誤日誌記錄通過cron job挪到 歷史表中。並清空前日記錄。

 

有興趣的朋友,可以通過github檢視程式碼。

https://github.com/chuckchen1222/parse_pglog