精简系统日志统一平台设计

一、平台背景

现在常用的日志统一汇总系统日志平台有几种:ELK、graylog或syslog-ng + 二次开发、ELK相关组件二次开发等。本篇的重点主要关注需要收集日志的一端。开始之前,先说下需求:现网有设备基本有5000台左右,系统运维和应用运维是分开来的。所以站在系统运维的角度来说,一般只关心和OS及系统自带的软件部分的报错。应用的日志不需要去管。所以这里设计的简单架构如下:

rsyslog-elk

二、架构设计

如果把主机上的所有日志*.*全部发送给服务器端,客户端确实是省事了,不过这会增加服务端的数据存储量,所以这里选择使用 kern.*;*.warn只收集有关告警以上级别和kernel级的日志,这就过滤掉了大部分的日志。我们按每台每天平均假设有1000条这样的消息(实际主机上不出问题,基本是不会产生此类日志的),5000台主机30天的数据也就是1000 * 5000 * 30 = 1亿5千万条,这个记录对于数据库来说并不算多。

这部分日志这里选择直接使用linux上自带的rsyslog进行处理,并通过tcp或udp传给logstash(也可以在主机安装filebeat,通过filebeat直接实入elasticsearch),这样做的好处是省去了再安装其他软件的麻烦。几千台机器同时传给logstash如果感觉处理的慢了,可以增加kafaka或redis进行缓存。这样做还有一个好处,就是有些主机如果发送的有某些无意义的告警,可以再加上关键字过滤进行排除。

入Elasticsearch库后,可以选择的前台展示方式,可以选择Kibana也可以选择Rraylog(开源版有限制)。同时告警也可以使用ELK中的sentinl组件实现。

三、demo配置

这里给出个大框架型的配置方法,现网使用的时候可以根据具体情况调整。

1、rsyslog配置

# cat /etc/rsyslog.d/systemlog.conf
kern.*;*.warn  /var/log/kern.log
kern.*;*.warn  @10.212.52.18:514

上面不想要本地输出,也可以去掉本地输出,直接指定到远程主机就可以了。这里我选择了使用udp传输,也可以使用tcp进行传输。

2、ELK套件安装

[root@localhost elk]# rpm -ivh elasticsearch-7.4.2-x86_64.rpm
Preparing...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Updating / installing...
   1:elasticsearch-0:7.4.2-1          ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service
future versions of Elasticsearch will require Java 11; your Java version from [/usr/local/jdk-10.0.2] does not meet this requirement
Created elasticsearch keystore in /etc/elasticsearch
[root@localhost elk]# rpm -ivh kibana-7.4.2-x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:kibana-7.4.2-1                   ################################# [100%]
[root@localhost elk]# rpm -ivh logstash-7.4.2.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:logstash-1:7.4.2-1               ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated
Successfully created system startup script for Logstash

上面可以看到elasticsearch对java版本比较挑剔,这里使用的java10还提示版本低,后面换用了最新的java13。

3、ELK配置

-- elasticsearch配置
# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
# grep -vE '#|^$' /etc/elasticsearch/elasticsearch.yml
cluster.name: elk
node.name: elk01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["elk01"]
# systemctl restart elasticsearch.service
# curl 127.0.0.1:9200
-- kibana 配置及启动
# cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
# grep -vE '#|^$' /etc/kibana/kibana.yml
server.host: "0.0.0.0"
i18n.locale: "zh-CN"
# systemctl restart kibana.service
-- logstash配置
# systemctl restart kibana.service
# cat conf.d/system.conf         #新建一个监控系统日志的配置文件
input {
    tcp {
        port => 514
        type => syslog
    }
    udp {
        port => 514
        type => syslog
    }
}
output {
    elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-systemlog-%{+YYYY.MM.dd}"
    }
    stdout {  }
}

上面的标准输出也可以去掉,调试的时候比较有用
可以看到如下命令,使用此命令启动:
# /usr/share/logstash/bin/logstash --path.settings /etc/logstash

登陆 kibana web 控制台:http://:5601 ,【管理】-【索引模式】-【创建索引模式】,在【索引模式】文本框中输入system-log,在下面可以看到【成功!您的索引模式匹配 1 个索引。】,然后点击【下一步】, 在【时间筛选字段名称】中选择 【@timestamp】,点击【创建索引模式】,然后点击面板的【Discover】,即可看到日志信息

kibana-discover

以上就先暂时建好了统一日志管理的雏形,后面要做的工作还有很多,比如:关键字匹配并告警、日志保存的时间长短、如何图形展示、logstash性能不足时,传输给redis(内存级)或kafka(磁盘级)并再中转给logstash等。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注