1. ELK日志分析简介
1.1 ELK日志分析概述
ELK可运行于分布式系统之上,通过搜集、过滤、传输、储存,对海量系统和组件日志进行集中管理和准实时搜索、分析,使用搜索、监控、事件消息和报表等简单易用的功能,帮助运维人员进行线上业务的准实时监控、业务异常时及时定位原因、排除故障、程序研发时跟踪分析Bug、业务趋势分析、深度挖掘日志的大数据价值。ELK主要可解决的问题如下:1.日志查询,问题排查,上线检查.2.服务器监控,应用监控,错误报警,Bug管理. 3.性能分析,安全漏洞分析。综上,ELK是一套方便、易用的日志分析开源解决方案。
1.2 ELK主要组件介绍
生产环境中,ELK通常由以下4个组件构成:
1.2.1 ElasticSearch组件
ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
1.2.2 Logstash组件
Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具,如下图所示:
1.2.3 Kibana组件
Kibana是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
1.2.4 Filebeat组件
Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件,并且转发这些信息到赋予他的输出位置(常见如elasticsearch、kafka或logstarsh)中存放。Filebeat等同于一个轻量级的logstash,当你需要收集信息的机器配置或日志资源数量不是特别多时,最佳实践是使用filebeat来代替logstash收集日志,filebeat十分小巧且稳定。下图是filebeat的工作流程:当你开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。
2. Docker-elk搭建实验环境
2.1 sebp/elk镜像的获取
外网环境下,执行命令:docker pull sebp/elk
将镜像pull到本地来。
2.2 制作上报日志到ELK的filebeat镜像
(1) 本地Window在官网下载filebeat,然后通过SecureCRT导入tar.gz压缩包文件并在linux中解压。
(2) 安装JDK 镜像
与elk镜像同理,将JDK的官方镜像pull到本地,作为基础镜像就好:java:8u111-jdk .
(3) 开放filebeat访问ELK的权限
在我们使用的elk镜像源码的git仓库中(地址是https://github.com/spujadas/elk-docker
),下载该镜像的logstash-beats.crt文件来给filebeat提供授权,制作镜像时要放在指定目录下。
(4) 修改配置文件filebeat.yml
首先配置抓取WEB日志的目录:
- type: log
# Change to true to enable this prospector configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /applog/*.log
接下来为filebeat提供ELK授权:
#output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]
(5) 制作filebeat和web服务的启动脚本
编写启动filebeat和web应用的脚本filebeat-springboot-entrypoint.sh,在docker容器启动的时候执行,这样就能让fliebeat和web应用在容器启动后也自动启动了:
echo "start filebeat now ..."
nohup /opt/filebeat-6.2.2-linux-x86_64/filebeat -e -c /opt/filebeat-6.2.2-linux-x86_64/filebeat.yml >/dev/null 2>&1 &
echo "start springboot jar now ..."
java -jar $1
(6) 通过Dockerfile完成filebeat镜像构建
Dockerfile脚本的内容如下:
#基础镜像
FROM java:8u111-jdk
#定义日志文件存放目录,这个要和web应用的日志配置一致
ENV APP_LOG_PATH /applog
#定义证书文件目录,这个要和filebeat.yml的配置一致
ENV FILE_BEAT_CRT_PATH /etc/pki/tls/certs
#定义filebeat文件夹名称
ENV FILE_BEAT_PACKAGE_NAME filebeat-6.2.2-linux-x86_64
#定义证书文件名称
ENV FILE_BEAT_CRT_NAME logstash-beats.crt
#定义启动文件名称
ENV ENTRYPOINT_FILE_NAME filebeat-springboot-entrypoint.sh
#定义时区参数
ENV TZ=Asia/Shanghai
#设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#使之生效
RUN . /etc/profile
#创建日志目录文件夹
RUN mkdir $APP_LOG_PATH
#存放证书的文件夹
RUN mkdir -p $FILE_BEAT_CRT_PATH
#从当前目录將证书文件复制到镜像中
COPY ./$FILE_BEAT_CRT_NAME $FILE_BEAT_CRT_PATH/
#从当前目录將filebeat文件复制到镜像中
COPY ./$FILE_BEAT_PACKAGE_NAME /opt/$FILE_BEAT_PACKAGE_NAME
#复制启动文件
COPY ./$ENTRYPOINT_FILE_NAME /$ENTRYPOINT_FILE_NAME
#赋写权限
RUN chmod a+x /$ENTRYPOINT_FILE_NAME
如上所述,前面我们准备的材料在脚本都统统用上了;将filebeat-6.2.2-linux-x86_64 文件夹、Dockerfile文件、filebeat-springboot-entrypoint.sh文件、logstash-beats.crt放在同一目录下,执行以下命令即可将镜像构建成功:
docker build -t springboot-app-filebeat:0.0.3 .
注意:最后有一个空格和一个点,这代表当前路径,不加的话会构建失败。
2.3 通过2.2制作web工程镜像
(1) 用maven创建一个springboot的web工程,在工程的目录src/main/resources下增加一个logback.xml文件,用于配置日志有关的参数。日志文件的目录设置在/applog/,和filebeat.yml中搜集日志的目录保持一致(完成)
<!-- 文件日志:输出全部日志到文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/applog/output.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
(2) 在web工程的pom.xml中,新增一个插件docker-maven-plugin,用于将当前工程构建成的jar做成docker镜像文件,基础镜像使用2.2中构建好的filebeat镜像。
<!--新增的docker maven插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<!--docker镜像相关的配置信息-->
<configuration>
<!--镜像名,这里用工程名-->
<imageName>bolingcavalry/${project.artifactId}</imageName>
<!--TAG,这里用工程版本号-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--镜像的FROM,使用springboot-app-filebeat:0.0.3-->
<baseImage>springboot-app-filebeat:0.0.3</baseImage>
<!--该镜像的容器启动后,直接运行spring boot工程-->
<entryPoint>["sh","/filebeat-springboot-entrypoint.sh","/${project.build.finalName}.jar"]</entryPoint>
<!--构建镜像的配置信息-->
<dockerHost>http://10.66.35.173:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
(3) 新增HelloController.java用于响应web请求,并且每次收到请求时都会打印一行日志到指定文件中。
@RequestMapping(value="/hello/{username}",method= RequestMethod.GET)
public String hello(@PathVariable String username) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date());
logger.info("execute hello from {} - {}", username, time);
return "hello " + username + ", " + time;
}
(4) 在pom.xml文件所在目录执行以下命令,即可编译构建当前工程,并制作成docker镜像:shell mvn clean package -U -DskipTests docker:build
2.4 连接2.1和2.3实现ELK管理WEB服务
通过docker-compose.yml来启动ELK和最终镜像。完成两者的连接,使web工程在ELK容器中运行。
vi docker-compose.yml
version: '2'
services:
elk:
image: elk:6.4.2
ports:
- "5601:5601"
- "9200:9200"
restart: always
webapp:
image: elkdemo:1.0
depends_on:
- elk
links:
- elk:elkhost
ports:
- "18080:8080"
restart: always
启动:shell sudo docker-compose up -d
注意:1.ELK server容器的5601端口映射为当前电脑的5601端口,用于访问kibana;2.web应用镜像使用link参数绑定ELK server容器,3使用webapp作为域名的地方都会被解析为ELK server容器的IP地址;3.web容器的8080映射为当前电脑的18080端口,访问当前电脑的18080端口即可访问web服务。
至此,整个ELK环境所需的镜像和脚本都已做好,web服务和ELK服务也都成功运行起来了,实验环境搭建完毕。
3. Logstash与filter插件应用
3.1 Logstash常用filter插件
Filter是Logstash功能强大的主要原因,它可以对Logstash Event进行丰富的处理,比如说解析数据、删除字段、类型转换等等,常见的有如下几个:
(1)date: 日志解析,从字段解析日期以用作事件的Logstash时间戳。
(2)grok:正则匹配解析。将非结构化事件数据分析到字段中。 这个工具非常适用于系统日志,Apache和其他网络服务器日志,MySQL日志,以及通常为人类而不是计算机消耗的任何日志格式。
(3)dissect:分割符解析。基于分隔符原理解析数据,解决grok解析时消耗过多cpu资源的问题,使用分隔符将非结构化事件数据提取到字段中。解剖过滤器不使用正则表达式,速度非常快。 但是,如果数据的结构因行而异,grok过滤器更合适。dissect的应用有一定的局限性:主要适用于每行格式相似且分隔符明确简单的场景 。
(4)mutate:对字段做处理,比如重命名、删除、替换等。
(5)json:按照json解析字段内容到指定字段中。
(6)geoip:增加地理位置数据。根据ip地址提供对应的地域信息,比如经纬度、城市名等,方便进行地理数据分析。
3.2 Logstash日志过滤实践
(1) 修改filebeat.yml文件,将filebeat的输出从elasticsearch改为logstash:
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"] #注释掉这句,filebeat不再输出到elasticsearch,改为向logstash输出
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]
(2) 查看正在运行中的容器,找到ELK容器elk:6.4.2
hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c02f0f0f6047 elkdemo:1.0 "sh /filebeat-spring…" 8 weeks ago Up About an hour 0.0.0.0:18080->8080/tcp docker_webapp_1
308de13c21e0 elk:6.4.2 "/usr/local/bin/star…" 8 weeks ago Up About an hour 0.0.0.0:5601->5601/tcp, 5044/tcp, 9300/tcp, 0.0.0.0:9200->9200/tcp docker_elk_1
(3) 进入ELK容器: sudo docker exec –it /bin/bash ,此处的container-name为308de13c21e0
hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker exec -it 308de13c21e0 /bin/bash
root@308de13c21e0:/# ls
bd_build bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
(4) 修改/opt/logstash/config路径下的logstash-sample.conf,增加JSON过滤插件
#本操作使用json插件,处理结果删除掉message字段。
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
(5) 通过配置文件来启动logstash,若出现端口占用需要先杀掉此前占用5044端口的进程:
bin/logstash -f logstash-sample.conf
(6) 处理结果为
{
"_index": "filebeat-2019.05.22",
"_type": "doc",
"_id": "CnCs3WoBtWWwz0jz3Y4z",
"_version": 1,
"_score": null,
"_source": {
"beat": {
"name": "be58d50b9f23",
"hostname": "be58d50b9f23",
"version": "6.2.2"
},
"tags": [
"beats_input_codec_plain_applied"
],
"@version": "1",
"source": "/applog/output.2019-05-22.log",
"@timestamp": "2019-05-22T03:53:09.901Z",
"offset": 2722,
"prospector": {
"type": "log"
},
"host": "be58d50b9f23"
},
"fields": {
"@timestamp": [
"2019-05-22T03:53:09.901Z"
]
},
"sort": [
1558497189901
]
}
4. 小结
本文首先简单介绍了ELK日志分析的总体框架和重要组件,接下来通过docker-elk完成了日志分析平台的实验环境搭建,最后对logstash和它的filter插件做了简单介绍和实验验证。后续会继续研究ELK的配置优化和插件运用,为后续ELK集成的WEB打好基础。
来源:oschina
链接:https://my.oschina.net/u/4408208/blog/3226108