日志监控体系的必要性
1:我们知道一微服务项目,
小型的也有上10个节点,每个节点至少2个server,
多几十个server, 当我们在微服务项目中查看日志的时候,
你就不知道到日志分布在哪一台具体server上面。
2:日志有很多,中间件日志 tomcat、nginx、应用程序本身,
我们就需要统一日志管理工具,对收集的日志进行汇总、分组、索引
统一进行分析和查看。
一、 日志监控体系的架构
架构演进
参考 centos手工安装:ELK详细安装部署
二、相关中间件安装
elk套件中,牵扯的组件比较多,不光有Elk三个组件,还有其他组件,
还要配置三个组件之间相互通信,配置还是有点麻烦,
我们选用GitHub 通用的 docker compose实现一键进行配置。
当然,这个配置也使用与 rancher , 使用rancher的时候 把 相对路径,改成绝对路径即可。
2.1 组件和端口说明
组件 | 作用 | 端口 | 类似产品 |
---|---|---|---|
Elasticsearch | 负责存储数据,适合全文检索; 所有安装配置看官网,特别全乎。elastci download | 9200: Elasticsearch HTTP 、9300: Elasticsearch TCP transport(集群通讯保持心跳,一般用不到) | |
Logstash | 采集、转换、充实,然后输出,需要在每台主机上面安装 | 5000: Logstash TCP input(收集日志端口) 、5044 | Filebeat |
Kibana | 负责数据的可视化,类似promethues中的grafana | 5601: Kibana | grafana |
Filebeat | 轻量级数据收集引擎,轻量 级别的Logstash; ELK Stack 在 Agent 的第一选择 ;以轻量化方式收集、解析和传输数据;Beats有很多子产品,Filebeat是其中的一种 | Logstash |
版本号,Elk 套件的版本好,要保持一致,不让回出问题。我们选取6.8.0
,7.x 最新的资料少,springboot也需要对应升级的。6.8.0版本不老,不新,docker pull速度也快。 下载最新的6.8.x速度有时候还是非常慢的。
2.2 docker compose实现一键安装Elk
约定的配置文件放置位置:/usr/local/docker_volume/elk
,我们把 github clone到本地
docker compose安装配置文件 docker-elk compose
国内同步地址-docker-elk compose,改地址无法直接用于rancher,但可以参考
由于上面的docker-compose使用的是V3版本,rancher不支持,我们使用:dangerfarms/elk-rancher- 组合安装、
ELK-on-rancher 单个安装
- 宿主机准备数据,如果elasticsearch报错
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
,我们使用命令在宿主机查看:sysctl -a|grep vm.max_map_count
, 要修改:
#在/etc/sysctl.conf文件最后添加一行:
vm.max_map_count=262144
#保存之后,让立即生效, 在宿主机执行:
/sbin/sysctl -p
# 宿主机上面查看一下
sysctl -a|grep vm.max_map_count
- 映射宿主机的目录进行授权
chmod +677 /usr/local2/docker_volume/elk/elasticsearch/
- 启动完成之后访问:
curl http://localhost:9200
、curl http://localhost:5601/app/kibana
2.3 架构优化,加入 kafaka
2.4 项目logstash 收集日志配置
2.4.1 收集spring项目日志
spring项目默认日志输出到控制台`console`,
我们输出日志的地方同时输出一份到**logstash**的5000端口。
这样就实现了,logstach对spring应用日志的收集。
当然也可以,把 日志映射到指定目录,我们去抓取
使用docker配置映射路径,/usr/local2/docker_volume/elk/logstash/pipeline:/usr/share/logstash/pipeline
,这里是文件夹里面可以是多种日志。
- QA: 这里我们定义了多个input,发现输出内容是错乱的
- Reason:
究其原因,是因为 logstash 运行起来的时候,会将所有的配置文件合并执行。因此,每个 input 的数据都必须有一个唯一的标识,在 filter 和 output 时,通过这个唯一标识来实现过滤或者存储到不同的索引。
- Result: 参考:【ELK - logstash 多个配置文件及模板的使用】
##pipline/logstash.conf
## eg: spring系统日志,需要需改日志文件,日志文件输出的时候输出一份到 logstash的5000端口,logstach在推送给 es.
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}
## Add your filters / logstash plugins configuration here 也可也不要直接空着。 这对抓取的数据进行格式化处理,变成 可以方便识别的n个字段。
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
if [type] == "syslog" {
elasticsearch {
hosts => ["elasticsearch:9200"]
user => "elastic"
password => "changeme"
}
# 将日志输出到当前的终端上显示
stdout { codec => rubydebug }
}
}
这里的日志收集配置文件可以是多个,如:pipline/logstash-xxx.conf
logstash configuration
multiple-pipelines
2.4.2 收集nginx日志
##pipline/logstash-nginx.conf
input {
file {
type =>"nginx-log"
path => ["/var/log/nginx/access.log", "/usr/local/nginx/logs/access.log"]
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
## Add your filters / logstash plugins configuration here 也可也不要直接空着。最好进行格式化,方便查看。 hosts可以是主机ip或者域名,也可以是docker link的容器名称。
output {
if [type] == "nginx-log" {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "nginx-log-%{+YYYY.MM}"
}
# 将日志输出到当前的终端上显示
stdout { codec => rubydebug }
}
}