使用 Kibana 和 Rsyslog 监控 Linux 日志
如果你是一名系统管理员,或者是一名好奇的软件开发工程师,那么你很有可能在平常挖掘日志信息的时候找到一些很有价值的信息。
有时你或许想监控虚拟机的 SSH 指令。
有时你或许想查看下你的应用程序服务器在某一天某一个特定的时间出现了什么样的错误信息。
或者你为了想一探究竟到底是谁停了你的一个虚拟机的 systemd 服务。
如果你想从这几个地方了解的话,或许你来对地方了。在这篇文章当中,我们将会构建一个完整的日志监控流水线,使用 ELK 堆栈(ElasticSearch、Logstash、和 Kibana)和 Rsyslog 作为一个强力的系统日志服务器。
在开始动手之前,让我们先快速的考虑下技术因素,让我们讨论下为什么我们使用 Kibana 监控 Linux 日志。
-
你可以通过日志得到实时可视化的反馈: 这或许是众多日志监控理由中最关键的一个,你可以构建一些有意义的可视化视图(例如表格,饼状图,图表或者柱状图)来为你的日志赋予一些意义。 -
你可以汇总这些信息来构建高级以及复杂的仪表盘: 有时一个原始数据是不够的,你或许想加上一些其他的日志或者将它们与其他日志比较从而了解一个整体的变化趋势。一个具有表达式处理功能的可视化平台可以让你这样操作这些信息。 -
你可以快速过滤一个特定的术语或者是一个给定的时间段: 如果你只对 SSH 日志感兴趣,你可以为其构建一个指定的仪表盘。 -
以一种快捷和优雅的方式,日志是可导航的: 我知道从日志文件中无止尽的日志信息中抓取信息的痛苦。我宁愿有一个平台来专门做这件事。
-
日志在 Linux 系统是如何处理的(Ubuntu 或 Debian)以及什么是 rsyslog。 -
怎样安装 ELK 堆栈(ElasticSearch 7.2,LogStash 和 Kibana)以及这些工具是用来做什么的。 -
怎样配置 rsyslog 从而将日志转发到 Logstash。 -
怎样配置 Logstash 从而获取日志以及 ElasticSearch 存储。 -
怎样使用 Kibana 来构建我们最终的可视化仪表盘。
-
有一个安装了 rsyslog 的 Linux 系统。可以有一个带有 rsyslog 的独立计算机或者是一个集中式日志处理系统。 -
有管理员权限或者是有足够的权限在你的 Linux 系统上安装新的安装包。
-
rsyslog: 作为高级的 syslog 服务器,rsyslog 将日志使用我们先前提到的 RFC 5424 的格式转发到 Logstash 上。 -
Logstash: 作为 ELK 堆栈的一部分,Logstash 会将日志由 syslog 格式转换为 JSON。提醒一下,ElasticSearch 使用 JSON 作为输入。 -
ElasticSearch: 著名的搜索引擎会将日志存储在一个专用的日志索引(logstash-*)中。ElasticSearch 索引这些日志然后令其可用于分析当中。 -
Kibana: 作为一个可探测的以及可视化的平台,Kibana 将会存放我们最终显示的仪表盘。
$ sudo apt-get install default-jre
ubuntu:~$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing)
// b-添加 Elastic 安装包到你的实例 //
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list $ cat /etc/apt/sources.list.d/elastic-7.x.listdeb https://artifacts.elastic.co/packages/7.x/apt stable main $ sudo apt-get update
// c-安装 ElasticSearch //
sudo apt-get install elasticsearch
-
下载 ElasticSearch deb 安装包; -
创建一个 elasticsearch 用户; -
创建一个 elasticsearch 用户组; -
自动创建一个配置好的 systemd 服务(默认为 inactive)
$ sudo systemctl start elasticsearch● elasticsearch.service - ElasticsearchLoaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)Active: active (running) since Mon 2019-07-08 18:19:45 UTC; 2 days agoDocs: http://www.elastic.co
$ sudo lsof -i -P -n | grep LISTEN | grep 9200java 10667 elasticsearch 212u IPv6 1159208890 0t0 TCP [::1]:9200 (LISTEN)java 10667 elasticsearch 213u IPv6 1159208891 0t0 TCP 127.0.0.1:9200 (LISTEN)
'http://localhost:9200/_all/_search?q=*&pretty' curl -XGET
// d-安装 Logstash //
sudo apt-get install logstash
sudo systemctl status logstash
sudo systemctl start logstash
$ sudo lsof -i -P -n | grep LISTEN | grep 9600java 28872 logstash 79u IPv6 1160098941 0t0 TCP 127.0.0.1:9600 (LISTEN)
// e-安装 Kibana //
sudo apt-get install kibana
$ sudo systemctl start kibana$ sudo lsof -i -P -n | grep LISTEN | grep 5601node 7253 kibana 18u IPv4 1159451844 0t0 TCP *:5601 (LISTEN)
// a-从 Logstash 转发到 ElasticSerach //
input { udp { host => "127.0.0.1" port => 10514 codec => "json" type => "rsyslog" }} # The Filter pipeline stays empty here, no formatting is done. filter { } # Every single log will be forwarded to ElasticSearch. If you are using another port, you should specify it here.output { if [type] == "rsyslog" { elasticsearch { hosts => [ "127.0.0.1:9200" ] } }}
sudo systemctl restart logstash
netstat -na | grep 10514udp 0 0 127.0.0.1:10514 0.0.0.0:*
// b-从 rsyslog 转发到 Logstash //
# This line sends all lines to defined IP address at port 10514# using the json-template format. *.* @127.0.0.1:10514;json-template
template(name="json-template"type="list") { constant(value="{") constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"@version\":\"1") constant(value="\",\"message\":\"") property(name="msg" format="json") constant(value="\",\"sysloghost\":\"") property(name="hostname") constant(value="\",\"severity\":\"") property(name="syslogseverity-text") constant(value="\",\"facility\":\"") property(name="syslogfacility-text") constant(value="\",\"programname\":\"") property(name="programname") constant(value="\",\"procid\":\"") property(name="procid") constant(value="\"}\n")}
$ sudo systemctl restart rsyslog $ curl -XGET 'http://localhost:9200/logstash-*/_search?q=*&pretty' { "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 10000, "relation": "gte" }, "max_score": 1, "hits": [ { "_index": "logstash-2019.07.08-000001", "_type": "_doc", "_id": "GEBK1WsBQwXNQFYwP8D_", "_score": 1, "_source": { "host": "127.0.0.1", "severity": "info", "programname": "memory_usage", "facility": "user", "@timestamp": "2019-07-09T05:52:21.402Z", "sysloghost": "schkn-ubuntu", "message": " Dload Upload Total Spent Left Speed", "@version": "1", "procid": "16780", "type": "rsyslog" } } ] } }
太棒了!现在我们将 rsyslog 的日志存储到了 ElasticSearch 中了。
这是所有乐趣开始的地方。
// a-简单说下 Kibana //
// b-为进程绘制汇总的条形图 //
// c-按程序名称显示的饼形图 //
// d-按严重程度显示的饼形图 //
// e-监控 SSH 条目 //
干得漂亮!现在你的面板已经从 discover 面板添加到仪表盘中了。
通过这篇文章,你会着手使用这个架构应用到你的基础设施中吗?
你会觉得其他的面板跟你在系统中调试故障时息息相关吗?
译者:0N0thing