全鏈路監控之日誌傳輸
最近部門系統準備上全鏈路監控服務,既然監控,得先有日誌。日誌傳輸路徑大概可分為:
由圖中所示分為兩步:
一、從業務系統收集儲存至 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中。