1. 程式人生 > 其它 >全鏈路監控之日誌傳輸

全鏈路監控之日誌傳輸

技術標籤:運維全鏈路監控rsyslogkafkatopic

最近部門系統準備上全鏈路監控服務,既然監控,得先有日誌。日誌傳輸路徑大概可分為:

由圖中所示分為兩步:

一、從業務系統收集儲存至 rsyslog 中

收集過程就是按照指定格式記錄日誌,收集完畢後通過 openlog() 和 syslog() 函式寫入 rsyslog 檔案中:

$log_tag = 'test_link_monitor';
openlog($log_tag, SYSLOG_OPTION, SYSLOG_FACILITY);
syslog(LOG_INFO, json_encode($log, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
closelog();

這裡的 $log_tag 顧名思義是日誌的標籤,$log 是收集到的日誌內容。當在程式中執行到這兩個函式時,在前端機的 /var/log/messages 檔案中就可以看到具體的日誌內容了。類似以下這種:

Jan 18 09:34:54 localhost test_link_monitor: {"uid":"","req_id":"349ddd4bf71c21dc9a3b0b5edbcb1644","time":1610933694134,"script":"http://xxxx.xx.xx/xx/xx/xxx?page=1&page_size=3"...}

過程中可能還會遇到如下錯誤:

openlog() has been disabled for security reasons;
syslog() has been disabled for security reasons

這時只需要在 php 配置檔案中找到這塊區域:

; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names.
; http://php.net/disable-functions
disable_functions = passthru,exec,system,chroot,chgrp,chown,popen,ini_alter,ini_restore,dl,readlink,openlog,syslog,symlink,popepassthru,stream_socket_server

去除 openlog 和 syslog 就 ok 了。

二、從rsyslog傳輸到kafka。

日誌寫入 /var/log/messages 後,就要通過 rsyslog 程序再將日誌寫入 kafka 了。先在 /etc/rsyslog.d 目錄下定義相關配置檔案,如 test_kafka.conf:

# 載入omkafka和imfile模組
module(load="omkafka")
module(load="imfile")

# ruleset
ruleset(name="test-kafka") {
    #日誌轉發kafka
    action (
        type="omkafka"
        partitions.number="1"
        topic="test_link"
        broker="localhost:9092"
    )
}

# 定義訊息來源及設定相關的action
input(type="imfile" Tag="test_link_monitor" File="/var/log/messages" Ruleset="test-kafka")

ruleset 可包含多條 rule, 一個 rule 就是 rsyslog 處理訊息的一種方式,每個 rule 都包含 action。輸入模組這裡用的是imfile 模組,作用是將所有的文字檔案內容逐行轉到 syslog 中。topic 名稱定義的 test_link,在 kafka 中也會有對應的同名topic;最後一行的Tag也被賦值為 test_link_monitor,與之前日誌中定義的 $log_tag 變數是對應的。定義好配置檔案後,即可通過如下命令檢視配置檔案是否正常。

[[email protected] rsyslog.d]# /sbin/rsyslogd -N 1
rsyslogd: version 8.24.0-52.el7_8.2, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

可以看出配置檔案沒問題。這時不著急重啟rsyslog 程序,先啟動 kafka 並建立對應的 topic。

[[email protected] kafka]# ./bin/kafka-server-start.sh -daemon config/server.properties
[[email protected] kafka]# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_link

如之前所述,已建立了 topic,並命名為 test_link。可用如下命令檢視 topic 列表,以及對應的 topic 資訊。

[[email protected] kafka]# ./bin/kafka-topics.sh --list --zookeeper localhost:2181
test_link
test_lucas
[[email protected] kafka]# ./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test_link
Topic: test_link	PartitionCount: 1	ReplicationFactor: 1	Configs: 
	Topic: test_link	Partition: 0	Leader: 0	Replicas: 0	Isr: 0

接下來檢視該 topic 的消費資訊:

[[email protected] kafka]# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_link --from-beginning

此時由於還沒有任何程式往裡寫資料,應該也沒有任何反應。這時在另一個終端視窗再重啟 rsyslog 程序:

[[email protected] kafka]# service rsyslog restart
Redirecting to /bin/systemctl restart rsyslog.service

可以看到 topic 中有資料了:

[[email protected] kafka]# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_lucas --from-beginning
2021-01-18T18:54:21.114422+08:00 lucas test_link_monitor ...

2021-01-18T18:54:21.114441+08:00 lucas test_link_monitor ...

2021-01-18T18:54:21.114455+08:00 lucas test_link_monitor ...
...

至此,業務日誌已成功寫入kafka中。