最近部门系统准备上全链路监控服务,既然监控,得先有日志。日志传输路径大概可分为:
由图中所示分为两步:
一、从业务系统收集存储至 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 变量是对应的。定义好配置文件后,即可通过如下命令查看配置文件是否正常。
[root@lucas 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。
[root@lucas kafka]# ./bin/kafka-server-start.sh -daemon config/server.properties
[root@lucas kafka]# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_link
如之前所述,已创建了 topic,并命名为 test_link。可用如下命令查看 topic 列表,以及对应的 topic 信息。
[root@lucas kafka]# ./bin/kafka-topics.sh --list --zookeeper localhost:2181
test_link
test_lucas
[root@lucas 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 的消费信息:
[root@lucas kafka]# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_link --from-beginning
此时由于还没有任何程序往里写数据,应该也没有任何反应。这时在另一个终端窗口再重启 rsyslog 进程:
[root@lucas kafka]# service rsyslog restart
Redirecting to /bin/systemctl restart rsyslog.service
可以看到 topic 中有数据了:
[root@lucas 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中。