一、概述:
Beats:分布在每个应用服务器的采集器
Beats平台集合了多种单一用途数据采集器,这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。
Logstash:接收Beats传过来的数据,分析数据,并发送到存储日志的地方
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
Elasticsearch:用来存储格式化好的统计数据
Elasticsearch是一个基于Lucene的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch是遵从Apache开源条款的一款开源产品,是当前主流的企业级搜索引擎。
Kibana:把统计数据通过图表形式展现出来
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
二、安装:
2.1 准备工作
* 系统环境:Centos7.4
* 安装必备软件:
yum install java-1.8.0-openjdk
* 新建目录:
mkdir /tools
mkdir /tools/install/
mkdir /tools/download/
* 新建es用户:
groupadd es #增加es组
useradd es -g es -p es #增加es用户并附加到es组
chown -R es:es /usr/lib/jvm/ #java也需要分配给es用户访问权限
chown -R es:es /tools/ #安装目录分配权限
su es #切换到es用户
2.2 安装Elasticsearch
2.2.1 Elasticsearch下载:
cd /tools/download/
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.tar.gz
2.2.2 解压Elasticsearch程序包:
tar -xzf elasticsearch-6.4.3.tar.gz
mv /tools/download/elasticsearch-6.4.3 /tools/install/elasticsearch-6.4.3
chown -R es:es /tools/install/elasticsearch-6.4.3
2.2.3 Elasticsearch的配置
* 进入elasticsearch-6.4.3目录
cd /tools/install/elasticsearch-6.4.3
* 设置jvm虚拟内存:
vi config/jvm.options
-Xms512m
-Xms512m
* elasticsearch.yml配置:
vi config/elasticsearch.yml
如需远程主机需访问该elasticsearch服务,需配置对外出口ip和端口:
指定路径:可以不指定,默认当前路径的data和logs,指定路径后要配置es组的权限
配置下载:
* 启动elasticsearch
./bin/elasticsearch -d
* 停止elasticsearch
ps -ef |grep elasticsearch
kill -9 进程id
* 启动配置服务可能会出现的几个错误
1. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
vi /etc/security/limits.conf
加入:
es soft nofile 65536
es hard nofile 65536
执行命令:ulimit -Hn
2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
3.max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
vi /etc/security/limits.d/90-nproc.conf
4. system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
bootstrap.system_call_filter: false
2.2.4 启动成功的访问地址
curl 'http://localhost:9200/?pretty'
2.3 安装Kibana
2.3.1 Kibana下载:
cd /tools/download/
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.3-linux-x86_64.tar.gz
2.3.2 解压Kibana程序包:
tar -xzf kibana-6.4.3-linux-x86_64.tar.gz
mv /tools/download/kibana-6.4.3-linux-x86_64 /tools/install/kibana-6.4.3-linux-x86_64
chown -R es:es /tools/install/kibana-6.4.3-linux-x86_64
2.3.3 Kibana配置:
* 配置Kibana, 配置server.host地址,需远程连接,因此配置服务器内网IP即可。
vi config/kibana.yml
配置如下:
server.port: 5601
server.host: "172.16.151.119"
elasticsearch.url: "http://localhost:9200"
配置下载:
* 启动kibana
nohup ./bin/kibana &
* 访问kibana
访问:http://172.16.151.119:5601
外网:http://外网IP:5601
2.4 安装Filebeat
2.4.1 Filebeat下载:
cd /tools/download/
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-linux-x86_64.tar.gz
2.4.2 解压Filebeat程序包:
tar -xzf filebeat-6.4.3-linux-x86_64.tar.gz
mv /tools/download/filebeat-6.4.3-linux-x86_64 /tools/install/filebeat-6.4.3-linux-x86_64
chown -R es:es /tools/install/filebeat-6.4.3-linux-x86_64
2.4.3 配置filebeat.yml文件
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/logs/*.log
fields_under_root: true
fields:
alilogtype: applog
#============================= Filebeat modules ===============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 3
#----------------------------- Logstash output --------------------------------
output.logstash:
hosts: ["localhost:5044"]
配置下载:
2.4.4 启动filebeat
nohup ./filebeat -c ./filebeat.yml &
2.5 安装logstash
2.5.1 logstash下载:
cd /tools/download/
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.3.tar.gz
2.5.2 解压logstash程序包:
tar -xzf logstash-6.4.3.tar.gz
mv /tools/download/logstash-6.4.3 /tools/install/logstash-6.4.3
chown -R es:es /tools/install/logstash-6.4.3
2.5.3 配置logstash.conf文件
vi config/logstash.conf
配置如下:
input {
beats {
port => 5044
}
}
filter {
grok {
patterns_dir => ["/tools/install/logstash-6.4.3/patterns"]
match => {
"message" => "%{IPORHOST:forwordip}.*%{HTTPDATE:logtime}.*"
}
remove_field => ["message", "host", "tags", "input", "@timestamp", "offset", "host", "@version", "beat"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "beat-mylog"
#user => "elastic"
#password => "changeme"
}
stdout { codec => rubydebug }
}
配置下载:
正则配置:
2.5.4 配合jvm.options虚拟内存
-Xms1g
-Xmx1g
2.5.5 配置logstash.yml文件
vi config/logstash.yml
node.name: test
pipeline.id: main
pipeline.workers: 2
pipeline.batch.size: 125
pipeline.batch.delay: 50
pipeline.unsafe_shutdown: false
path.config: /tools/install/logstash-6.4.3/config/logstash.conf
http.host: "127.0.0.1"
http.port: 9600-9700
配置下载:
设置 |
描述 |
默认值 |
node.name |
节点的描述性名称 |
机器的主机名 |
path.data |
Logstash及其插件用于任何持久需求的目录 |
LOGSTASH_HOME/data |
pipeline.id |
管道的ID |
main |
pipeline.workers |
将并行执行管道的过滤和输出阶段的工人数量,如果你发现事件正在备份,或者CPU没有饱和,请考虑增加这个数字,以更好地利用机器处理能力 |
主机CPU核心的数量 |
pipeline.batch.size |
在尝试执行过滤器和输出之前,单个工作线程将从输入中收集的最大事件数,更大的批处理大小通常更高效,但代价是增加内存开销,你可能需要增加jvm.options配置文件中的JVM堆空间,有关更多信息,请参阅Logstash配置文件 |
125 |
pipeline.batch.delay |
当创建管道事件批处理时,在向管道工作人员发送一个较小的批处理之前,等待每个事件的时间为多少毫秒 |
50 |
pipeline.unsafe_shutdown |
当设置为true时,即使内存中仍然存在游离事件,也会在关闭期间强制Logstash退出,默认情况下,Logstash将拒绝退出,直到所有接收到的事件都被推送到输出,启用此选项可能导致关闭期间的数据丢失 |
false |
path.config |
主管道的Logstash配置路径,如果指定目录或通配符,配置文件将按字母顺序从目录中读取 |
特定于平台的,请参阅Logstash目录布局 |
config.string |
包含要用于主管道的管道配置的字符串,使用与配置文件相同的语法 |
None |
config.test_and_exit |
当设置为true时,检查配置是否有效,然后退出,注意,在此设置中没有检查grok模式的正确性,Logstash可以从一个目录中读取多个配置文件,如果你把这个设置和log.level: debug结合起来,Logstash将对合并后的配置文件进行日志记录,并用它来自的源文件注解每个配置块 |
false |
config.reload.automatic |
当设置为true时,定期检查配置是否已更改,并在更改配置时重新加载配置,这也可以通过SIGHUP信号手动触发 |
false |
config.reload.interval |
Logstash多久检查一次配置文件以查看更改 |
3s |
config.debug |
当设置为true时,将完整编译的配置显示为debug日志消息,你还必须设置log.level: debug,警告:日志消息将包含传递给插件配置的任意密码选项,可能会导致明文密码出现在日志中! |
false |
config.support_escapes |
当设置为true时,引号中的字符串将处理以下转义序列:n变成文字换行符(ASCII 10),r变成文字回车(ASCII 13),t变成文字制表符(ASCII 9),\变成字面反斜杠,"变成一个文字双引号,'变成文字引号 |
false |
modules |
当配置时,modules必须位于上表中描述的嵌套YAML结构中 |
None |
queue.type |
用于事件缓冲的内部队列模型,为基于内存中的遗留队列指定memory,或者persisted基于磁盘的ACKed队列(持久队列) |
memory |
path.queue |
启用持久队列时存储数据文件的目录路径(queue.type: persisted) |
path.data/queue |
queue.page_capacity |
启用持久队列时使用的页面数据文件的大小(queue.type: persisted),队列数据由分隔成页面的仅追加的数据文件组成 |
64mb |
queue.max_events |
启用持久队列时队列中未读事件的最大数量(queue.type: persisted) |
0(无限) |
queue.max_bytes |
队列的总容量(字节数),确保磁盘驱动器的容量大于这里指定的值,如果queue.max_events和queue.max_bytes都指定,Logstash使用最先达到的任何标准 |
1024mb(1g) |
queue.checkpoint.acks |
当启用持久队列时,在强制执行检查点之前的最大ACKed事件数(queue.type: persisted),指定queue.checkpoint.acks: 0设置此值为无限制 |
1024 |
queue.checkpoint.writes |
启用持久队列时强制执行检查点之前的最大写入事件数(queue.type: persisted),指定queue.checkpoint.writes: 0设置此值为无限制 |
1024 |
queue.drain |
启用时,Logstash会一直等到持久队列耗尽后才关闭 |
false |
dead_letter_queue.enable |
标记指示Logstash以插件支持的DLQ特性 |
false |
dead_letter_queue.max_bytes |
每个dead letter队列的最大大小,如果条目将增加dead letter队列的大小,超过此设置,则删除条目 |
1024mb |
path.dead_letter_queue |
存储dead letter队列数据文件的目录路径 |
path.data/dead_letter_queue |
http.host |
指标REST端点的绑定地址 |
"127.0.0.1" |
http.port |
指标REST端点的绑定端口 |
9600 |
log.level |
日志级别,有效的选项是:fatal、error、warn、info、debug、trace |
info |
log.format |
日志格式,设置为json日志以JSON格式,或plain使用Object#.inspect |
plain |
path.logs |
Logstash将其日志写到的目录 |
LOGSTASH_HOME/logs |
path.plugins |
哪里可以找到自定义插件,你可以多次指定此设置以包含多个路径,插件应该在特定的目录层次结构中:PATH/logstash/TYPE/NAME.rb,TYPE是inputs、filters、outputs或codecs,NAME是插件的名称 |
特定于平台的,请参阅Logstash目录布局 |
2.5.6 logstash启动
nohup ./bin/logstash -f ./config/logstash.conf &
参数 |
说明 |
举例 |
-e |
立即执行,使用命令行里的配置参数启动实例 |
./bin/logstash -e "input {stdin {}} output {stdout {}}" |
-f |
指定启动实例的配置文件 |
./bin/logstash -f config/test.conf |
-t |
测试配置文件的正确性 |
./bin/logstash -f config/test.conf -t |
-l |
指定日志文件名称 |
./bin/logstash -f config/test.conf -l logs/test.log |
-w |
指定filter线程数量,默认线程数是5 |
./bin/logstash -f config/test.conf -w 8 |
2.5.7 相关地址
input监听:0.0.0.0:5044
Logstash API endpoint:http://127.0.0.1:9600
{"host":"iZbp1f69c0ocoflj7y2nlxZ","version":"6.4.3","http_address":"127.0.0.1:9600","id":"de36d17d-ca9d-4123-a33b-c2b9af00dcd9","name":"test","build_date":"2018-10-31T00:19:35Z","build_sha":"17e7a50dfb0beb05f5338ee5a0e8338e68eb130b","build_snapshot":false}
三、格式化日志:
3.1 nginx日志参数配置:
nginx日志输出参数配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
nginx日志内容:
* POST:
219.135.135.2 - - [29/Nov/2018:18:41:13 +0800] "POST /portal/users/cartList HTTP/1.1" 302 5 ?appName=luckwine-portal-web&channelCode=01&traceId=1712884f4c9e4d8ad9bdb843824dd197& "http://47.106.219.117:8010/home?a=1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" "-" 0.008
* GET:
219.135.135.2 - - [29/Nov/2018:18:16:32 +0800] "GET /portal/common/needLogin?dd=23 HTTP/1.1" 200 96 - "http://47.106.219.117:8010/home?a=1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" "-" 0.002
nginx日志参数:
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #"Content-Length" 请求头字段
$content_type #"Content-Type" 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,"http" 或 "https"
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent #用户终端浏览器等信息
$http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的http_x_forwarded_for设置
$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
3.2 Logstash捕获字段:
3.2.1 input组件
input {
beats {
port => 5044
}
}
3.2.2 output组件
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "beat-mylog"
#user => "elastic"
#password => "changeme"
}
stdout { codec => rubydebug }
}
3.2.3 filter组件
官方文档:https://www.elastic.co/guide/en/logstash/6.4/filter-plugins.html
完整规格:
filter {
#正则捕获字段
grok {}
#字段类型转换
mutate {}
#时间数据赋值到另外字段
date {}
#删除数据
drop {}
}
3.2.3.1、Grok匹配日志字段:
a、新建分析nginx日志的配置logstash.conf
filter {
grok {
patterns_dir => ["/tools/install/logstash-6.4.3/patterns"]
match => {
"message" => "%{nginx_log}"
}
remove_field => ["message"]
}
date {
match => [ "logtime", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
}
b、捕获方法名 正则表达式
* 规则如下:
nginx_log %{IPORHOST:clientip} - %{USER:user} [%{HTTPDATE:logtime}] "(?:%{WORD:method} %{URIPATH:requestURI}(%{URIPARAM:parms}|)(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:status} %{NUMBER:bytes} (%{URIPARAM:parms}|-) %{QS:referrer} %{QS:agent} "(%{IPORHOST:forwordip}|-)" %{NUMBER:reqtime}
grok正则捕获:
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
kinbana测试正则捕获是否正确:
3.2.3.2、Mutate字段转换
Mutate转化器文档:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-convert
https://blog.csdn.net/cromma/article/details/52919742
Mutate作用:用于每个输出的字段作后续转换操作
convert:
将字段的值转换为另一种类型,如将字符串转换为整数。如果字段值是数组,则将转换所有成员。如果字段是散列,则不采取任何操作
mutate {
convert => {
"bytes" => "integer"
"reqtime" => "float"
}
}
lowercase & uppercase:
大小写转换,数组类型,字段名字作为数据元素。
mutate {
lowercase => [ "fieldname" ]
}
join:数组的分割字符串
使用固定连接符号,连接数组内的元素,如果给定的字段不是数组类型,什么也不做。
mutate {
split => ["message", "|"]
}
mutate {
join => ["message", ","]
}
#join处理前
"message" => “1|2|3|4”
#join处理后
"message" => “1,2,3,4”
merge:拼接字符串
字符串 + 字符串
数组 + 字符串
操作逻辑:把追加字段的字符拼接到目标字段字符上
mutate {
merge => { "目标字段" => "追加字段" }
}
split: 分割字符为数组
使用分隔符将字段拆分为数组。只对字符串字段有效。
mutate {
split => { "fieldname" => "," }
}
#split处理前
"message" => “1|2|3|4”
#split处理后
"message" => [
[0] "1",
[1] "2",
[2] "3",
[3] "4"
]
gsub:替换字符串
数组类型,没有默认设置。
该参数设置只针对string类型,如果不是string类型的,什么也不做。
mutate {
gsub => [
"agent", """, "",
"referrer", """, ""
]
}
strip:
从字段中删除空白。注意:这只适用于开头和结尾的空格。
mutate {
strip => ["field1", "field2"]
}
3.2.3.3、IP库:
geoip {
source => "clientip"
target => "geoip"
}
获取到的IP数据:
lat:维度 lon:经度
"geoip" => {
"country_code3" => "CN",
"latitude" => 39.9289,
"region_name" => "Beijing",
"location" => {
"lat" => 39.9289,
"lon" => 116.3883
}
3.2.3.4、Drop删除过滤器:
说明:把url中包含图片、css样式、js等文件不要录入日志统计
if ([requestURI] =~ "jpg|png|gif|css|js|ico"){
drop {}
}
3.2.3.5、使用新的配置文件启动:
nohup ./bin/logstash -f ./config/logstash.conf &
3.3 kibana界面配置:
界面配置:
https://www.elastic.co/guide/cn/kibana/current/tutorial-visualizing.html