|
|
搭建ELK C$ S* a6 `% I. F
ELK是由elasticsearch、logstash、kibana三个开源软件组成的一个组合体,ELK是elastic公司公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,官方域名为elastic.io,ELK stack的主要优点:
! x0 ?; |( H; |) Z4 K; d
5 g$ i* A' K/ v1 V- A处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能配置相当简单:elasticsearch的API全部使用JSON接口,logstash使用模块配置,kibana的配置文件部分更简单检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿数据的查询秒级响应。集群线性扩展:elasticsearch和logstash都可以灵活线性扩展前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单
2 {1 o2 [. x" ~/ z3 E6 s6 bElasticsearch
& x/ w, j9 D- A) {elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如nginx、tomcat、系统日志等功能。2 e1 G+ E, a) |. W7 k( Z
& |6 B* B+ Z$ S2 Z$ m2 E
elasticsearch的特点:5 l3 q( z6 e, {: n7 @
" s/ l0 o: W* C3 g
实时收索、实时分析分布式架构、实时文件存储文档导向,所有对象都是文档高可用,易扩展,支持集群,分片与复制接口友好,支持json
' {2 @1 E! z7 ?2 S部署elasticsearch
9 M6 F" L9 ~0 x" [) h/ ~GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine,基于java开发/ A5 o l9 i0 P2 i+ Q7 ^
3 f0 B, n7 I/ d. x y1 b, ucentos系统关闭服务器的防火墙和selinux,ubuntu关闭防火墙,保持各服务器时间同步6 ~, N+ @& T, Y+ N
9 t1 s4 U7 }, l$ s服务器1:172.20.22.247 H) |0 x4 j$ `# I" W& d2 ]
) c# t+ v" _8 n8 c. N7 \
服务器2:172.20.22.27- ?* E, J8 z8 C
$ Q, ]' l8 V8 A2 i% u服务器3:172.20.22.28
( o( Z+ q0 ?* J5 a1 |, { . T. b+ Z2 ]; h' C+ i' l
###ubuntu
6 O c0 E- z8 x% d' k0 ~. F# apt install -y ntpdate
5 f+ c" v X8 i3 \$ e5 t; U0 a+ c# rm -f /etc/localtime
) G+ ~! N& v }' l3 q7 w p# [' Y# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
9 ~$ Y6 O$ T. j6 t3 Z& }9 n/ w9 Q# hwclock --systohc
" ?1 \* H4 Q: s, T. \3 t; F# ntpdate -u ntp1.aliyun.com( [4 f! {4 t+ {, ]/ o7 c8 F! F$ T
###设置内核参数$ c* x( O/ n7 w8 p
# vim /etc/security/limits.conf
; P# t/ Q" c1 p# y* soft nofile 5000004 M3 Y( `! s9 O4 }/ ?
* hard nofile 500000! i3 s. O8 N6 E% a5 I( W
# vim /etc/security/limits.d/20-nproc.conf
+ L9 d7 o3 ]1 t! i- N1 _* soft nproc 4096
, Z9 f6 P& u4 \( X) l$ ]elasticsearch soft nproc unlimited% p: ]8 G5 f6 L# w- |9 _
root soft nproc unlimited0 G8 I" X! R" i2 N
###安装jdk
2 R+ T# @1 x- p8 B, ]( @) y7 _$ u# apt install -y openjdk-8-jdk
$ V; X q$ ~4 o* X6 D! d. k
7 O" m2 t5 \# D1 g! s- r###每个节点都安装
' V2 s0 P% h( S# g1 E( A7 a3 o$ z# ls -lrt elasticsearch-7.12.1-amd64.deb* [) w, h6 h. [8 s3 B( Q
# dpkg -i elasticsearch-7.12.1-amd64.deb& D$ s7 q3 `! a
###节点1配置文件0 g" p2 i, I: h/ m
# grep '^[^#]' /etc/elasticsearch/elasticsearch.yml
" w. f- n6 @) U7 ccluster.name: m63-elastic #集群名称+ ?! a) [: e* |; L
node.name: node1 #当前节点在集群内的节点名称
- {4 ^' \8 @% m. x5 H4 `3 Spath.data: /data/elasticsearch #数据保存目录
% q7 c8 [0 T5 D0 q* ^$ `path.logs: /data/elasticsearch #日志保存目录
" W( |/ R6 v1 N) l: Z0 Y" ^bootstrap.memory_lock: true #服务启动的时候锁定足够的内存,防止数据写入swap
2 F* u0 c. v0 r7 |, t7 Enetwork.host: 172.20.22.24 #监听IP
" m5 }' T* d& T" o, \http.port: 9200 #监听端口
% `2 L- w/ k9 [% q###集群中node节点发现列表
4 c, v( l; q* A8 O7 e4 H: X1 j \discovery.seed_hosts: ["172.20.22.24", "172.20.22.27","172.20.22.28"]
; N' I8 c7 f# u0 k# l8 J: h/ w+ p###集群初始化哪些节点可以被选举为master
. Y* X& `! A7 J3 @cluster.initial_master_nodes: ["172.20.22.24", "172.20.22.27","172.20.22.28"]$ R4 g4 s8 b$ M% S, _ n. C( E
action.destructive_requires_name: true/ _ [0 t+ u1 q4 g! p( x, t
# mkdir /data/elasticsearch -p
; H6 Z7 m8 R. y5 o( v# chown -R elasticsearch. /data/elasticsearch- h* n6 ?, t8 j0 G6 D) \
# systemctl start elasticsearch.service
; M3 s, R4 J* n2 T! o% e###节点24 s4 I) r7 `, D3 y0 s" d+ P
# grep '^[^#]' /etc/elasticsearch/elasticsearch.yml% _* B/ e6 ^, ~* i- w
cluster.name: m63-elastic- ^4 q! n* n* b5 F, V8 |
node.name: node25 b' Y3 _4 S+ p
path.data: /data/elasticsearch
7 f* V! t b7 j+ S* @/ jpath.logs: /data/elasticsearch
# S/ r; v+ H) o" ?# `( Dnetwork.host: 172.20.22.27$ z% u( F5 \2 @6 I; a7 d
http.port: 9200
0 z0 ~- k8 y* F' p, ~- K: Bdiscovery.seed_hosts: ["172.20.22.24", "172.20.22.27","172.20.22.28"]
. K a- \9 j* b, F& T, Ucluster.initial_master_nodes: ["172.20.22.24", "172.20.22.27","172.20.22.28"]
5 K4 \2 w) `" _" l0 J4 paction.destructive_requires_name: true$ n0 d) b3 i. @+ o( {9 w& p. c
# mkdir /data/elasticsearch -p
9 O" U5 Z! f8 _. J# G# chown -R elasticsearch. /data/elasticsearch5 I# f1 F+ I& u- y. T/ E$ {5 Z0 j) U
# systemctl start elasticsearch.service) ^) J& B1 T7 L( l' Q7 \
###节点3# l: _! I. M3 T
# grep '^[^#]' /etc/elasticsearch/elasticsearch.yml y6 d8 E) G5 R; ]) h
cluster.name: m63-elastic; {6 Y& \$ _8 x; H
node.name: node3/ `2 @ j7 f' X) M+ p
path.data: /data/elasticsearch
' }7 f5 c/ g, g' K3 g' R7 xpath.logs: /data/elasticsearch
3 R! u5 i8 B: j9 jnetwork.host: 172.20.22.28
5 W3 W: }& A1 b* ]% P. Hhttp.port: 9200
' m) ] x) f3 r4 L* @7 n; A" Ldiscovery.seed_hosts: ["172.20.22.24", "172.20.22.27","172.20.22.28"]
4 p1 u2 @* ?( C o0 p' p+ K. zcluster.initial_master_nodes: ["172.20.22.24", "172.20.22.27","172.20.22.28"] U# D2 `7 C' c: w
action.destructive_requires_name: true0 z. c8 J& F: F. \3 K; R2 ~1 J% V
# mkdir /data/elasticsearch -p
. M z4 \) K0 s/ F e$ d4 Z3 Z# chown -R elasticsearch. /data/elasticsearch
4 f& `) Y4 C4 H4 J# systemctl start elasticsearch.service
( `8 A! K5 Z' ]4 k/ {! U浏览器访问验证
3 h, h; b$ _7 i, N; m( R( w& zhttp://$IP:9200
5 R, X) g$ A( [- C* Y* N3 R, R) [. c( D+ C3 E9 U, r& O2 @
- p+ M; `* L& I2 T 6 d/ w/ X4 K' a/ O, f' Z
Logstash
( }. Z5 Q0 m& H$ c- I7 kLogstash是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析,最终把经过处理的日志发送给elasticsearch。
T/ c% u- z" N0 f4 \
. q$ y! t p: U$ F: U8 {! N部署Logstash ) O, |( ~/ w1 r b# g
Logstash是一个开源的数据收集引擎,可以水平伸缩,而且logstash是整个ELK当中用于最多插件的一个组件,其可以接收来自不同来源的数据并统一输出到指定的且可以是多个不同目的地3 |* ?! {, i1 H0 {+ b1 v0 j
" M. C$ | F; g4 W
https://github.com/elastic/logstash #GitHub
% y7 K' v1 ?. v( C
3 F2 z! X' z" A h( tElastic Stack and Product Documentation | Elastic
/ c, a3 s$ E( [5 }. x. V ! s! m! {6 K. B: ^) y7 E3 i6 e
环境准备:关闭防火墙和selinux,并且安装java环境6 M1 |6 |+ W. v$ W9 e3 G
5 c: I' z4 T2 |9 {2 K. n. T# apt install -y openjdk-8-jdk
' {1 B$ s6 S; l6 u) o# ls -lrt logstash-7.12.1-amd64.deb
5 {( c2 W- I* i2 H9 ^# dpkg -i logstash-7.12.1-amd64.deb% x0 o$ |* s9 {. r- F& {
###启动测试% e! H' ?* [, M% h
# /usr/share/logstash/bin/logstash -e 'input { stdin {} } output { stdout {}}' ##标准输入和标准输出# l r; U" i! y% f$ G
hello world!~( m, d' f% k; x5 B# d. s8 j8 d, {
{! l) \$ O/ i" s( o2 ^- c$ N1 w7 L# @
"@version" => "1",
( B f4 ]" @2 K& f4 J "@timestamp" => 2022-04-13T06:16:32.212Z,
3 @! e5 [" e. G+ ?+ i+ z. q "host" => "jenkins-slave",# L, S1 T+ ?7 a3 D/ B5 N% K: K+ I
"message" => "hello world!~"
! [# ]0 H" ?* N% R$ U: L}8 y5 @2 z# E4 U% Y- X
###通过配置文件启动
5 Z8 l g' T; W2 {4 c/ z# cd /etc/logstash/conf.d/- @0 c, K' o8 Y0 X$ H4 O
# cat test.conf
, x+ h- q* L, [2 _$ tinput {
' s0 H7 c- c0 d$ C+ g) m1 c stdin {}
3 L4 _9 ?- ?2 o}+ \1 N6 z; J$ J8 \4 E0 P7 v/ J
output {* j$ _! G8 S' E
stdout {}
4 d9 [# U- |3 ?4 N# Q1 U% X}
# s/ d5 v+ i2 e/ y+ ], O" n0 ?& A; j- {7 @6 L
###通过指定配置文件启动
, D* E7 a+ T3 s+ c/ ~) e% _# /usr/share/logstash/bin/logstash -f test.conf -t ##检查配置文件语法
4 b! f/ w! o4 P2 d" j& B3 G. q/ o8 |! ~# e# /usr/share/logstash/bin/logstash -f test.conf7 v) z% E, A, s; U6 ]
4 {! N3 A) P* y; O# _& M
####输出到elasticsearch
3 v: _/ Y7 E# g* r3 X# cat test.conf
, _! W9 d4 b C# w* U! }) _& Oinput {
. L, ^5 F" I; W& { stdin {}0 c' X' ~) O1 k3 Z; L% S" ?
}
$ H+ r' P( E* b4 ooutput {6 N* F8 W& @2 N# I6 e8 o( d4 Q4 `
#stdout {}+ {! }' @$ F& C; j5 k# V$ ^
elasticsearch {
6 d/ T* O8 F7 C6 T. O" J) x0 { hosts => ["172.20.22.24:9200"]; p! s& J$ z+ @
index => "magedu-m63-test-%{+YYYY.MM.dd}"4 l; g* K+ k; C. t$ w) A
}
4 r% T$ h1 @, J5 y. E! }}
' Y! L4 w. Q" `# /usr/share/logstash/bin/logstash -f test.conf
, | i$ E' \: J3 q0 i: eversion1
4 ^9 k& g: e n$ C* I! w8 Kversion23 i& g; @* O, ^& K7 q
version32 E0 @' `% J& ^$ W" L4 G+ B
test1
5 Z0 j1 }' } D9 ^6 U& rtest2
2 a N; j: W2 }+ u- \test3
% D. x$ j/ u5 i0 M( R5 I. p1 L) i% w. H8 I N
####elasticsearch服务器查看收集到的数据
! s- d- z. q; n+ N6 Z# ls -lrt /data/elasticsearch/nodes/0/indices/
) O3 j9 g$ n! v/ h) W7 ptotal 4$ `& y& V2 x5 U0 ~6 e& L# j
drwxr-xr-x 4 elasticsearch elasticsearch 4096 Apr 13 14:36 DyCv8w7mTleuAvlItAJlWA - ~ c; e3 v& E {
kibana
% m" Z2 y9 c7 K7 zkibana为elasticsearch提供一个查看数据的web界面,其主要是通过elasticsearch的API接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等
$ V9 f: S! e; C% s ~$ U( k) ^ 9 R8 h5 l- s' d6 X, b; Z+ V0 ~3 q" ^* T
部署kibana
$ l/ C% M! U0 `% M4 \% J" t2 s8 R% r# ls -lrt kibana-7.12.1-amd64.deb' J! a L0 U8 r- f; l3 O; ?- q
# dpkg -i kibana-7.12.1-amd64.deb* B& w" b) l/ A% \' v4 N. z; j
# grep "^[^$|#]" /etc/kibana/kibana.yml
9 n: d( e* Y6 ?9 g) Sserver.port: 5601
& H* J+ \2 f) e: j% O- xserver.host: "172.20.22.24"
' g1 P9 F" r2 s2 _0 f6 l/ @elasticsearch.hosts: ["http://172.20.22.27:9200"]3 P! x) R( r7 v8 R; D) }
i18n.locale: "zh-CN". ~6 |5 U) H9 C& a
# systemctl restart kibana " e. s2 K; P! _: V/ Q8 v
浏览器访问http://172.20.22.24:56018 z2 v9 M I/ c# e1 B/ L
7 K2 k3 ^/ w! W6 A( t/ vStack Management-->索引模式-->创建索引模式4 M- s5 R9 T' U& F
; t. j% S* Q0 J4 | H2 m& L0 \' f$ b 2 l8 J- m& b O2 D4 N" ~
选择时间字段
- ]$ T2 [" z F& ]- _
. N7 T* E1 f; M/ k5 \0 P: x查看对应创建的索引日志信息
2 {7 s! ~% r! y9 }# ^6 C( p4 Q, o) H+ r; ~% v# n/ ~- R1 f0 s
$ |& f( `) p& I$ M. ~7 K' b
* Q8 Y& {3 d7 H收集tomcat日志
1 H3 W- s7 H2 ~" D+ b: c收集tomcat服务器的访问日志以及tomcat错误日志进行实时统计,在kibana页面进行搜索展现,每台tomcat服务器要安装logstash负责收集日志,然后将日志转发给elasticsearch进行分析,再通过kibana在前端展现
$ q- |0 z1 k+ L- N* I( p2 g, ^ ' o, _; K3 y$ C0 S5 K3 _0 @
部署tomcat P& b6 F! n! S
####tomcat1,172.20.22.30
. G; O# _( e/ J* t. N4 w# apt install -y openjdk-8-jdk
; }( D3 I' w( X( y2 P/ L# ls -lrt apache-tomcat-8.5.77.tar.gz + ^- ^9 [# z" d, U6 `. P$ g s
-rw-r--r-- 1 root root 10559655 Apr 13 21:44 apache-tomcat-8.5.77.tar.gz
2 d4 B- s# J4 U" X4 c! A0 K2 ]# tar xf apache-tomcat-8.5.77.tar.gz -C /usr/local/src/
6 D4 X- C# W- U9 T; a4 {5 Z/ z# ln -s /usr/local/src/apache-tomcat-8.5.77 /usr/local/tomcat
; _" K- p: I0 q- n3 Z, i# cd /usr/local/tomcat
) Y' N9 z" i% Z# e# J###修改tomcat日志格式为json
: I3 h5 [# J( f3 h# vim conf/server.xml% L% {, u5 t" w0 b/ U
....6 q) _4 k& A0 x8 |* G0 T
- u( F9 O# ^$ p# p! z: P, k
....
3 m- X& B+ I- P8 N( r; _7 O0 P# mkdir /usr/local/tomcat/webapps/myapp+ D- t, `. C: [6 j) K: I( i, t
# echo "web1 172.20.22.30" > /usr/local/tomcat/webapps/myapp/index.html2 x, `6 l f3 v0 r, ^8 E
# ./bin/catalina.sh start% T6 L; R* d1 S2 g" V
; V3 u0 L0 s3 D- E' n3 C% @3 v$ ?0 ?
###访问测试
2 w: g+ g8 \7 f# curl http://172.20.22.30:8080/myapp/* {; J. `2 }! C4 s( f" l
###查看访问日志
% c9 [( O8 l ^3 ]( Y4 M# tail -f /usr/local/tomcat/logs/tomcat_access_log.2022-04-13.log% h" K$ |3 F7 O0 x2 ~2 z
+ W- ^" k9 P0 \; r! b####tomcat2,172.20.22.26
1 H L! i( a; k0 w q) e# apt install -y openjdk-8-jdk6 D* z. J9 F2 M2 N+ Y0 R
# ls -lrt apache-tomcat-8.5.77.tar.gz - O& j2 q, P/ O$ z
-rw-r--r-- 1 root root 10559655 Apr 13 21:44 apache-tomcat-8.5.77.tar.gz0 j" J% w; f9 Q3 Z2 ~
# tar xf apache-tomcat-8.5.77.tar.gz -C /usr/local/src/+ b7 c1 ]; B0 L
# ln -s /usr/local/src/apache-tomcat-8.5.77 /usr/local/tomcat' w3 z/ E, g. y" z' N, e) S
# cd /usr/local/tomcat+ g; z* E" w+ |' w3 |& b. K
###修改tomcat日志格式为json `1 t) k0 r- ]" B- x
# vim conf/server.xml6 M. w* l3 s+ C
....
z0 Y- F' C! L4 V6 }3 D
% t4 J6 ~$ z, D7 n! j) \' w: I5 j, y7 ]....% p6 I: b9 a1 r
# mkdir /usr/local/tomcat/webapps/myapp( K3 \4 J8 J' e. M% r
# echo "web2 172.20.22.26" > /usr/local/tomcat/webapps/myapp/index.html
* Z+ R3 y" G9 ^# ./bin/catalina.sh start
8 P7 Q3 O' S9 ~2 n# V/ l; ?/ t3 j/ C4 M
###访问测试
1 o/ a& H" o7 }* Q9 }, D$ S: R# curl http://172.20.22.26:8080/myapp/4 x: i; t9 B& w. z U6 I. q! v
###查看访问日志
2 O' k; M) P% u! r, I# tail -f /usr/local/tomcat/logs/tomcat_access_log.2022-04-14.log
( ~" c' b1 U, E, d3 X. \/ q部署logstash 3 S. x- V! T: z. u9 n9 t5 h
在tomcat服务器安装logstash收集tomcat和系统日志* N. V) ^* f b {2 l8 N4 I
8 n8 Q- v" e, F3 R
####tomcat1,172.20.22.30
( B( H- [1 A0 S# ls -lrt logstash-7.12.1-amd64.deb: Z* d8 n- a/ ^0 Y9 @. Z9 \& X
# dpkg -i logstash-7.12.1-amd64.deb
|0 k2 p6 K9 @& D3 L& R# vim /etc/systemd/system/logstash.service0 Z, s8 @7 y; h/ f+ w9 h/ Y, p
...* b0 ^% }0 ^; o7 X
User=root) }- u, h* s2 w. j- E- |
Group=root4 Q" F/ f5 J' ^, s8 T8 Y
...
. N7 l- v1 F6 H# cd /etc/logstash/conf.d3 F2 f# P" m8 a4 i- q1 C
# cat tomcat.conf
$ m8 O- y6 s/ m$ G4 y4 _9 |: ]input {
# k+ D, I$ \) R. l) K file {
' r/ I$ R" ?1 ?5 k% b" ^2 { path => "/usr/local/tomcat/logs/tomcat_access_log*.log"5 K0 R) P) R0 b
type => "tomcat-log"! A% J( w( H! D* e9 c7 m& ]- M) }
start_position => "beginning"
8 h, |2 @ g, u stat_interval => "3"
5 C9 _) `0 e% o }
. d5 k& \/ c, w v7 R1 y file {; `1 l6 t! {4 H# U8 \5 D: u# T+ T# C6 b
path => "/var/log/syslog"# O' ?0 _1 q/ M$ F& e
type => "systemlog"
- y# f; f* u3 N; g start_position => "beginning"
: n( P2 a1 n; R6 Y( l stat_interval => "3"
% h7 Z/ J2 p$ U( n. ?, ~) [1 d }
! n' T( W; K" c+ L- |, F0 E}8 Q+ B$ A% H" s1 `: U" s
output {, r. X/ w7 l( o
if [type] == "tomcat-log" {
9 D$ g- y! {3 V$ G- r: ^" m elasticsearch {" G" m* a4 H# c6 Z# V
hosts => ["172.20.22.24:9200","172.20.22.27:9200"]# _' Q) e7 b, L' c) w, X
index => "elk-tomcat-%{+YYYY.MM.dd}"7 ^5 F+ W b3 ]2 K5 S
}}% x1 O" V) ^4 J" @
if [type] == "systemlog" {
% k+ k8 i7 c% u$ \ elasticsearch {
* {2 a2 V u8 U4 j hosts => ["172.20.22.27:9200","172.20.22.27:9200"]
! v; l+ E& I/ K, n index => "elk-syslog-%{+YYYY.MM.dd}"
4 Y( K5 W6 u2 F" Q! r }}
* A) {- P5 D, F* X8 w- S/ y' t}- V6 D& r; M+ {# A
4 ^$ u) x: ]8 g/ |! Y& P# /usr/share/logstash/bin/logstash -f tomcat.conf -t+ O1 n1 U& [3 _( @
# systemctl daemon-reload
- ]% p2 a. F+ \ v" t- D# systemctl start logstash.service
* j% |5 k4 V: C9 r) V# scp tomcat.conf root@3172.20.22.26
b8 s. T! y- h% [+ B( u% W- L
$ \# H. `# F \2 ]( f6 ]1 C% f% L####tomcat2,172.20.22.26
$ R# n: I& ?$ `; y% _+ c# ls -lrt logstash-7.12.1-amd64.deb
! a- W* }$ ]9 Y$ I7 A+ [# dpkg -i logstash-7.12.1-amd64.deb# a1 o% {4 k5 X" ]
# vim /etc/systemd/system/logstash.service, C1 ~$ Q( j) B
...% d" W# r9 x5 W
User=root
* I! ]# q; K/ U* r# t6 ~8 V2 fGroup=root
! E" ?; e% ^* \9 ?1 E( w...) C ~- c2 }+ Z
# systemctl daemon-reload. r3 i! O/ `6 H" C* B$ D
# systemctl daemon-reload) P8 t. Z1 @9 |! B7 N2 d' G
# systemctl start logstash.service
' ^. m6 g# {6 T: V @( P通过kibana展现
/ O) j% `) @; `6 e6 g0 k# f/ H
0 W, Z2 w, x2 G# q1 u
9 \9 Q0 {% H# o6 ?收集Java日志
& ~4 n) V L5 c! Z3 D& t# b3 g2 l: E使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并7 ?3 n* X3 @" ?7 t" i! _
- N1 U& B6 h2 H EMultiline codec plugin | Logstash Reference [8.1] | Elastic9 X) B* Y) F' f9 H
6 V" G) ?6 S" i, l. P9 A/ k# A
添加logstash配置文件
$ G; g% C, k ^###收集logstash自身的日志,172.20.22.26
6 r U# J. R1 d& {, Z# cd /etc/logstash/conf.d
6 a6 d: F& |! j. x& @. V8 _# cat java.conf 8 j" s6 ^% z/ q; ]& Y* k) E" u
input {9 n3 Y+ Z% p5 W1 q
file {
! [8 K4 L6 \0 A6 j5 A/ Y path => "/var/log/logstash/logstash-plain.log") Q r9 [) D, C( w! _6 r% L
type => "logstash-log"* n$ v5 w% O/ i; w4 I! O: y( W) W
start_position => "beginning"
5 o3 F# V( F9 W" J- V$ w7 b% F) w* o stat_interval => "3"$ M- V0 U" N# b: }4 g- }
codec => multiline {4 s7 O x& t1 u# x" }: J% l G
pattern => "^\["
7 _7 L* @9 c* O8 E+ S negate => true
4 U) b# J; l2 \8 M9 F: |! K2 W) M: \ what => "previous"
8 ^8 C9 G- I' G. s# N }}
0 {& u/ x ]+ ]7 `}! V" Z: P5 V% v" l j
output {) _* f3 ?( t- E+ {
if [type] == "logstash-log" {4 f9 h$ S- `9 B* V
elasticsearch {% O; ?6 l( W1 i* i9 a* @9 {0 D
hosts => ["172.20.22.24"]
( X* u5 F( c1 d8 i- g6 d index => "logstash-log-%{+YYYY.MM.dd}"
5 V$ ?* ^! y4 K, o. m. `; J4 c" `9 q }}
& f% g8 a7 Y4 p# L}
|( w& z. |( p8 ?* A
5 E0 Y6 f! Y+ q/ N- ~# /usr/share/logstash/bin/logstash -f java.conf -t9 p' b/ W3 i% e4 k
# systemctl restart logstash.service
. E) K& x! S% o% l1 T6 z" `* O! b+ w3 L- l- t- i# j3 }9 V
###收集logstash自身的日志,172.20.22.309 q" U, X0 ]! B% {6 ]5 V
# cd /etc/logstash/conf.d
0 z' p2 p& W# u/ `0 |7 g9 d: i2 }7 B# cat java.conf
1 j: W6 H4 P' L+ A/ s0 _input {5 y; A5 N$ n! K, Z% L4 x
file {8 f Y; t' X5 e( p
path => "/var/log/logstash/logstash-plain.log"
' H; j/ B) P8 W' \ type => "logstash-log"% ?+ z; y) N3 C1 K1 j7 P. z
start_position => "beginning"! r- ? [! j- W; f
stat_interval => "3"" x x g1 `$ E. k# V8 T, u
codec => multiline {7 ]2 x: r) c8 G ~/ J/ F
pattern => "^\["- T# t( d3 T) f1 W9 C j: a3 \
negate => true
! N5 e" K; r4 m% C& J. s8 ] what => "previous"
& h8 G& l8 i% ~ }}( a7 |+ x4 h: q1 [- {
}# R/ f7 C2 \% F+ s( k
output {2 `: Y9 W& r' H& }8 m Z0 r& @7 s7 ]
if [type] == "logstash-log" {
) X0 s; ^. t, P3 |% n elasticsearch {
2 }4 s# N) {9 T Q7 X0 j( ^* d2 V6 ? hosts => ["172.20.22.24"]& k6 u* v1 _! x( Q+ x5 x- O
index => "logstash-log-%{+YYYY.MM.dd}" n# j$ h! |0 k/ u) L, p, ?
}}4 ?! O6 R* N* a, U1 L. a, L8 a
}
+ u1 v3 K) u: v9 B! T
7 h& p) ?$ X, B) B& k# k7 D# /usr/share/logstash/bin/logstash -f java.conf -t
, V. V. q/ z* x# systemctl restart logstash.service , b$ L" O6 h% V! F" b
查看kibana收集到的日志
( `3 h; @8 m% e1 T
" V- b% Z( S& X, }6 E 7 z9 E) ^" P# P/ v
# D. I, b3 C# a, r" F f5 Pfilebeat结合redis、logstash收集nginx日志 ) U. O% j9 E# x8 J, y) x! `" B2 @
使用filebeat收集日志发送到logstash1,再由logstash1发送到redis,最后再由logstash2发送到elasticsearch
Y1 O7 I7 S/ |4 R2 E- i( u+ a 6 x- t" z0 L; J, c- h; B
web1:172.20.22.30,部署好nginx、filebeat、llogstash; O; A D/ f' Y. J8 q7 r8 @0 w
* u9 o/ {$ t& p) f: h" T* t+ pweb2:172.20.22.26,部署好nginx、filebeat、llogstash
/ I# l- p9 q0 N) o2 u* Y& E
+ H+ Y6 S4 h8 j- v5 t& R' x$ llogstash服务器2:172.20.22.23,redis服务器:172.20.23.157% a$ r; Y9 g2 S F: X
% U/ F0 w, O% Z
nginx服务器相关配置
6 \- k: D6 j' U4 @: D部署nginx " c9 X8 Y+ C9 [' b
# wget http://nginx.org/download/nginx-1.18.0.tar.gz. E6 I& q v9 {' P
# tar xf nginx-1.18.0.tar.gz
/ n6 j7 f2 M3 t8 x& n( x# cd nginx-1.18.0
1 B, p( H! f: @9 X! m, X" k# [0 z# ./configure --prefix=/usr/local/nginx --with-http_ssl_module, S" u/ s U1 k: u- r, C
# make -j4 && make install6 ]: |. F0 R* l& ]6 p% z
# /usr/local/nginx/sbin/nginx 6 j8 d: i# T% X! G' F; v! a7 O7 M
部署配置logstash + d* x0 k1 v0 Y9 P
把filebeat收集到的日志信息发送到redis' |, {/ Y' o- z" I
: K" l6 b' l6 f% a# ^! P# apt install -y openjdk-8-jdk3 A P" m" S! B% I9 @* m
# dpkg -i logstash-7.12.1-amd64.deb
% y9 Y- z: L0 G; e t, b, _# cat /etc/logstash/conf.d/beats-to-redis.conf * l+ V$ t: F s+ W' A- V) A" |
input {5 V1 T" r P; B) z* ^- [ h% R, q
beats {" e! a2 B5 R1 X0 ]" V+ M
port => 50440 w; M/ o" k. I
codec => "json"
! y8 [0 J5 y9 U* c4 o0 ]! z! d2 Q9 N }0 G. m, g" h; t z+ A- R
beats {) L4 W1 \. F# C7 \8 Z8 t+ S9 `
port => 5045
0 J+ v( U8 _: D! Q2 B& F2 T4 M codec => "json"
: r5 T5 |5 z/ W( { }
, G l" {+ N) j( t: R}
$ u! }4 u0 l, \4 I' K9 M: B3 {6 Houtput {8 C* s& {, I ^1 ^6 U
if [fields][project] == "filebeat-systemlog" {4 L5 ~6 \1 j4 P- U7 M& O# }+ M
redis {
% ^# y! t0 [' ^& w8 h: }( `6 P data_type => "list"
) f5 s' X( E; B3 L5 J- ` key => "filebeat-redis-systemlog"! f& o/ b8 X7 A/ e
host => "172.20.23.157"
' J+ G) o9 w' g! t9 v# i! S port => "6379"! X" w# D$ Q, X5 Z* \1 g! a
db => "0"0 C* U5 x! ^4 _# _
password => "12345678"
4 N% T8 y9 T) D3 U% s5 N, ] }}- e, P2 _; d, @: J- k3 P5 v
if [fields][project] == "filebeat-nginx-accesslog" {( g: [! n' n3 O
redis {
6 c/ O. w9 A: C: i P# g data_type => "list". a9 U% O7 c" |9 f4 U2 H5 P
key => "filebeat-redis-nginx-accesslog"' v' M- X+ z4 O3 d6 K0 G
host => "172.20.23.157"
0 L; D: f) ~) a. v port => "6379"9 t4 D0 D: f7 g
db => "1"
% I" l7 l4 b& k- q password => "12345678"
# n$ Z; z# H# [) `" ~0 l; V' u1 @ }}1 z3 X% P# N: k
if [fields][project] == "filebeat-nginx-errorlog" {
& ^# r6 H& d) p' k& p* C redis {
8 V( u" [) N3 V/ z8 Y( C' a6 T data_type => "list" a0 p8 P! E3 M" J
key => "filebeat-redis-nginx-errorlog"
0 ?) ^/ L( z. S" v host => "172.20.23.157"
7 p1 s, A+ n: d0 B/ T port => "6379"6 h) I% e; n3 y: t1 J" J; v
db => "1"
2 i& |5 b( X0 r3 ?1 e+ H password => "12345678"( h1 M: o1 V }* ?9 p: k
}}
+ L; @: r- }# f3 }7 U& b}
6 Y9 R, ?: U' t* {+ q# systemctl start logstash
7 s: x$ i- _- \6 @# scp /etc/logstash/conf.d/beats-to-redis.conf root@172.20.22.26:/etc/logstash/conf.d/ & M c, K. n1 ]( b! |( t) y. q: F) P
部署配置filebeat $ v6 J2 [: |3 W( ?) {9 D
通过filebeat收集日志信息发送到logstash
/ B! z$ }6 R+ T- t1 z
0 ]" p: m6 S4 Y' }* ^1 v/ O# dpkg -i filebeat-7.12.1-amd64.deb
5 m/ y4 O$ B/ ^; }( k# grep -v "#" /etc/filebeat/filebeat.yml | grep "^[^$]"
! F, ?+ k1 o0 Q- v$ wfilebeat.inputs:
. {. a4 S% k, ]1 o) q- type: log
: L* @1 m7 p; `4 C* q enabled: true- k: m; i9 x1 m) a8 [! t- l1 B
paths:
; W; X3 l% o X* J+ p: P- r9 ~ - /var/log/syslog
: h" P& L/ c" W% u5 u3 R I fields:) e3 S6 V/ |6 ]) n0 V: ?; f% b; f! T
project: filebeat-systemlog5 C8 A8 ]: O- k p* D
- type: log
- d3 c7 r- u' J( I/ a6 v enabled: true
. ~* l5 _0 ^0 m# }& L+ W) F$ U/ C paths:
3 ?: s- F+ F1 j* A) [( _ - /usr/local/nginx/logs/access.log
: Q; x# J) F7 O6 {4 b fields:
8 w2 `- f; j4 I9 w* T" a* M project: filebeat-nginx-accesslog
* f1 r% ?$ f: M+ a8 D% x" K- type: log d1 f) R; A- ^7 |/ V
enabled: true
9 z8 {, Z( H2 n9 c! \ paths:
+ d e5 o$ T2 g - /usr/local/nginx/logs/error.log) ^: |' B) P9 w$ ~) q" ]# d
fields:+ T0 D: |& }$ B" p
project: filebeat-nginx-errorlog
: ?; P+ x8 x2 f h: zfilebeat.config.modules:% N2 w/ r3 E8 r4 S& _. a' s
path: ${path.config}/modules.d/*.yml, I5 R- p. l- @& P; f+ G
reload.enabled: false
, n% T4 G* A6 S9 Tsetup.template.settings:
4 r! m6 n7 O9 U% K- R1 Y index.number_of_shards: 1& W% z' l$ b5 W; u. E, Y
setup.kibana: _/ x9 T7 [$ A" Q
processors:
6 N2 j L- V0 X) j% u& r5 z - add_host_metadata:7 w1 h+ y2 I5 p( n& B* C/ z# a8 \
when.not.contains.tags: forwarded
% V7 b7 B3 b5 E0 H0 \3 D+ i - add_cloud_metadata: ~) {8 y" x$ G3 B* n
- add_docker_metadata: ~
. d2 W0 C# o7 ~+ S% J - add_kubernetes_metadata: ~! q. Z0 B7 e: W6 q! U' I
output.logstash:7 T6 I9 F* h* e- ~) N' p1 h8 p0 A8 J
hosts: ["172.20.22.30:5044","172.20.22.30:5045"]" P6 s9 G& r2 M; R( u% Z' t
enabled: true1 v% V# D9 u! C& ~& R
worker: 2: F- g3 }( R8 }9 s, B
compression_level: 3
) i5 k8 ?0 I Q loadbalance: true8 `$ D2 P' ?# Z
& |' f3 J6 v; g: A' Y2 a# systemctl start filebeat
* T' r5 d$ w/ v9 K5 Q; a( {9 ^# scp /etc/filebeat/filebeat.yml root@172.20.22.26:/etc/filebeat/ - Q7 b5 c' D7 B: m W
logstash服务器配置
; b2 ]4 k# e9 u- ?logstash服务器2:172.20.22.23,把redis缓存的日志发送到elasticsearch! l) b! A2 @8 ^" h
+ X% E+ p% k/ I0 G# apt install -y openjdk-8-jdk r n" d. G0 U; @1 g
# dpkg -i logstash-7.12.1-amd64.deb: V \" Y+ H0 z- p9 w3 X+ D+ w
# cat /etc/logstash/conf.d/redis-to-es.conf
. U' E, n1 f! A! sinput {; ?) G' _' p, k3 y$ W, H0 T5 F
redis {
' h4 o; T: D6 v data_type => "list"! U, y2 y# H i4 c) S. V" r; |
key => "filebeat-redis-nginx-accesslog"( G. g. C+ E, q6 v' D" Y7 B4 j* E
host => "172.20.23.157". {* B3 `% b7 x+ }
port => "6379"
7 U) o) a, I6 \$ E; w/ o db => "1"7 ^1 `* L) u( E0 `$ S
password => "12345678"
i4 Q( @. M! j4 V7 R1 B) n }
, X+ _) x3 {- q+ t redis {+ e; ]1 v' j* x1 e4 K' [3 w2 U
data_type => "list", r& z R; y0 G! s: I
key => "filebeat-redis-nginx-errorlog"
& `7 n9 C7 [* A host => "172.20.23.157"' n) l8 u8 Z% L9 f
port => "6379"
& K* Q# f8 t, T. N8 g db => "1"# S% ^7 P5 C; M6 V8 S
password => "12345678"" R1 k8 v8 ^/ `) p
} A3 r( L% u% s1 R2 T. V
redis {1 u; B" ^' G1 K2 a
data_type => "list"
U" C1 s6 \3 v1 p key => "filebeat-redis-systemlog"; J, S2 h# W$ ^$ O; {7 X
host => "172.20.23.157"+ U5 W. X6 r0 D( V/ }& P
port => "6379"
; [% R2 A8 }3 o db => "0"5 b0 i& `2 l. m* O4 h
password => "12345678"2 w5 ?2 S: b, f; | i: G
}3 }9 k5 c) R, R7 ^3 u
}$ q9 m: C; v/ `, t9 w1 `. E
output {
. q- G; O: C8 k4 Z: e$ K if [fields][project] == "filebeat-systemlog" {5 o) e( m. A- k7 T0 L
elasticsearch {2 f! i- @: c3 T* h3 H8 g8 K: d: ~
hosts => ["172.20.22.28:9200"]
/ Q* _; }3 X9 v0 R index => "filebeat-systemlog-%{+YYYY.MM.dd}"
q' z) V% [# v) Y2 x }}: b/ W% V+ ?( V% ^
if [fields][project] == "filebeat-nginx-accesslog" {
- n/ @- r, v+ i j# V5 J elasticsearch {
& V( l; d3 U0 K! w3 g8 h* f6 ~' c hosts => ["172.20.22.28:9200"]
2 r- V: q$ }7 J7 N- p3 K- l index => "filebeat-nginx-accesslog-%{+YYYY.MM.dd}"' D; \( ^& |, Q9 B' G8 |8 g
}}) q C' J4 c* C
if [fields][project] == "filebeat-nginx-errorlog" {- _7 _7 `0 w! m! r+ H/ `
elasticsearch {
! ]6 N$ w/ j C4 B' `# ]' O$ B hosts => ["172.20.22.28:9200"]
9 W" ^2 N: q0 j# m index => "filebeat-nginx-errorlog-%{+YYYY.MM.dd}"
1 {4 z7 \% ^+ R( a9 U9 m$ e }}2 y: M$ H' O7 J' m
}
+ z+ ~ S p9 O% L( Q# systemctl restart logstash.service
1 L4 r. \% X+ c4 }. l6 `redis安装配置 ; }; s. [8 D: J9 C
redis服务器:172.20.23.157,
- k5 G2 p6 t! N1 z* Q
# s5 |, K- b- J# yum install -y redis8 L4 D$ o7 E9 r! @- ]
# vim /etc/redis.conf7 i. C% Y3 V7 o% J X
####修改以下配置项 i* z! F1 u0 ]0 n. R8 S$ w
bind 0.0.0.0
" n; \+ _: j& t9 m7 a* U....
2 {7 x- n/ ~* E l3 g: csave ""
$ V" C, N0 C8 n....) n2 K0 E; I2 [% ]# p; k
requirepass 123456786 N, J8 l8 y: a5 O
....% \' g6 z4 D( Z% B
# systemctl start redis
( @5 {* D( ]$ v J###测试连接redis! X$ r) V* a" r/ |
# redis-cli 8 x4 P+ @4 ?: T4 j9 ], y, I
127.0.0.1:6379> auth 12345678% V7 k# j; P( C$ l5 E& d6 |5 z
OK8 w6 w+ S* \+ A
127.0.0.1:6379> ping# U0 G, h/ }5 J9 A' v$ ?
PONG* I$ C- T$ x7 \7 B o
3 A d3 b P5 K4 R- G/ v
###验证收集到的日志信息
1 W1 X' y! ?3 C( j$ O127.0.0.1:6379[1]> keys *. i( Q' B+ o6 D" U7 X; E& v
1) "filebeat-redis-nginx-accesslog"( \" o/ f; m: z s
2) "filebeat-redis-nginx-errorlog"
8 M- Y. a2 ]% _127.0.0.1:6379[1]> select 0
1 D0 o) z$ l3 H2 o9 ^( \' rOK
) P6 G d+ G+ G6 ^4 U. C127.0.0.1:6379> keys *& c% p! I; m4 X- ?( A) M% z
1) "filebeat-redis-systemlog" , ?9 n/ G* \: l: U% W" F
通过head插件验证生成的索引 Y! c" C$ \) a- y' @
- J, e" O6 D# k; ]$ ?( W4 g
! l! r5 d- k' d, rkibana验证收集到的日志信息
$ |7 h0 y/ [' O5 |. }+ T( H |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|