1. ELK应用场景
在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制。无论是开发人员还是运维人员都无法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。因此需要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展示,处理分析。
因此:ELK提供一套开源的解决方案,能高效、简便的满足以上场景。
2. ELK 简介
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
Logstash部署至服务主机,对各个服务的日志进行采集、过滤、推送。
Elasticsearch 存储Logstash传送的结构化数据,提供给Kibana。
Kibana提供用户UIweb页面进行,数据展示和分析形成图表等,Kibana一般与 Elasticsearch 部署在同一台服务器上,方便对日志进行数据传输与分析。
日志采集新增Logback直接发送日志到Logstash的形式。如果采用此方式,web服务可减少部分生成log文件配置,提高实时性和日志推送效率
3. ELK 日志系统常用的集中框架
(1) ELK经典框架 LogStash + ElasticSearch + Kibana
(2) ELK改进框架 Filebeat + LogStash + ElasticSearch + Kibana
由于Logstash消耗资源大,而服务器资源相当宝贵,所以引进另一个轻量级日志采集框架Beats,其中包含以下6种
Packetbeat 用于搜集网络流量数据
Heartbeat 用于运行时间监控
Filebeat 用于搜集文件数据
Winlogbeat 用于搜集winodws事件数据
Metricbeat 用于指标
Auditbeat 用于审计数据
(3) ELK框架与Logback的整合 Logback + LogStash + ElasticSearch + Kibana
传统web项目中,经常使用log4j以及logback(性能更高)等成熟日志插件进行日志的记录,是否提供更好的解决方案。
日志采集新增Logback直接发送日志到Logstash的形式。如果采用此方式,web服务可减少部分生成log文件配置,提高实时性和日志推送效率
(4) ELK高并发框架 Logback + Kafka/Redis+ LogStash + ElasticSearch + Kibana
由于logstash消耗性能,所以高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,所以可以添加中间件进行日志缓存处理。由于logstash数据源具有多种方式,所有中间件也可以很多选择,常见的有kafka,redis。
4. ELK 部署
部署环境:centos 7.4
(1) LogStash 下载及安装
下面介绍三种日志采集方式,日志文件+filebeat_logstash,log4j 和 logback三种方式.
1. logstash+filebeat 模式收集日志:
filebeat 配置文件设置: filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/service-hi.log
output.logstash:
hosts: ["192.168.1.4:5044"]
filebeat 启动:
sudo chown root filebeat.yml
sudo ./filebeat -e >filebeat.log 2>&1 &
logstash 配置文件设置:logstash-sample.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://10.0.0.5:9200", "http://10.0.0.13:9200", "http://10.0.0.17:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
logstash 启动:
./bin/logstash -f config/logstash-sample.conf >logstash.log 2>&1 &
2. log4j 模式采集日志:
log4j 配置文件 log4j_to_es.conf
input {
log4j {
mode => "server"
host => "localhost"
port => 4560
}
}
filter {
#Only matched data are send to output.
}
output {
elasticsearch {
action => "index" #The operation on ES
hosts => "localhost:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}
运行:
./bin/logstash -f config/log4j_to_es.conf
3. logback 采集日志:
logback 配置文件设置 : logback-es.conf
input {
tcp {
port => 9601
codec => json_lines
}
}
output {
elasticsearch {
hosts => "localhost:9200"
}
stdout { codec => rubydebug}
}
logback 运行:
./bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf ##命令窗形式
nohup ./bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf & ##后台线程形式
logback 浏览器查看:
localhost:9600
(2) ElasticSearch 下载及安装
elasticsearch 配置文件设置: elasticsearch.yml
network.host=localhost
network.port=9200
elasticsearch 启动:
./bin/elasticsearch
./bin/elasticsearch -d #后台线程运行
浏览器查看:
localhost:9200
(3) Kibana 下载及安装
Kibana 配置文件设置 kibana.yml
server.port: 5601 ##服务端口
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://10.0.0.5:9200","http://10.0.13:9200","http://10.0.0.17:9200"] ##elasticsearch服务地址 与elasticsearch对应
Kibana 运行:
/home/kibana-6.3.0-linux-x86_64/bin/kibana #命令窗启动
nohup ./kibana-6.3.0-linux-x86_64/bin/kibana & #后台线程启动
sudo systemctl stop kibana.service
sudo systemctl start kibana.service
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service
sudo systemctl start kibana.service
浏览器访问:
localhost:5601
注意:ElasticSearch ,Kibana,LogStash 下载缓慢,需要配置加速器及repo文件
5. 测试工程创建及配置
Spring Boot 工程创建,选择依赖 devops,web,lombok
这里以logback日志框架进行测试,其他俩种方式后面有时间进行补充。
pom.xml 添加依赖:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
主工程编写代码:
@SpringBootApplication
public class SpringbootLogbackApplication {
private final static Logger logger = LoggerFactory.getLogger(SpringbootLogbackApplication.class);
public static void main(String[] args) {
new Thread(()->{
for (int i=0;i<100;i++){
logger.info("---test---"+i);
}
}).start();
SpringApplication.run(SpringbootLogbackApplication.class, args);
}
}
resources 目录下新建logback.xml 文件,配置logback.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--这个名字将反应到每一条日志的开头-->
<contextName>car-trace-logging</contextName>
<!--设置变量,下面有用到。含义是日志保存路径-->
<property name="log.path" value="D:/log/CarTrace" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 级别过滤 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日志输出格式-->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名,用到了上面配置的路径-->
<file>${log.path}/car-trace.log</file>
<!--根据yyyy-MM-dd所以是每天新建文件,也可以设置其它格式,如每月或每分-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/car-trace.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.253.6:9601</destination> <!--指定logstash ip:监听端口 tcpAppender 可自己实现如kafka传输等-->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<!--设置日志隔离级别-->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file" />
<appender-ref ref="LOGSTASH" />
</root>
<!--设置具体包的隔离级别-->
<logger name="cn.theUnit4.Mapper" level="debug"/>
</configuration>
6. 工程启动测试,日志顺利打印
参考:https://blog.csdn.net/forezp/article/details/71189836
https://blog.csdn.net/forezp/article/details/98322521