易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4266|回复: 1
收起左侧

ELK日志系统浅析与部署

[复制链接]
发表于 2018-7-12 16:25:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
一、ELK应用场景

在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制。无论是开发人员还是运维人员都无法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。因此需要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展示,处理分析。

得此:ELK提供一套开源的解决方案,能高效、简便的满足以上场景。

二、ELK日志系统介绍

1、ELK分别是Elasticsearch、Logstash、Kibana三个开源框架缩写。

框架
简介
作用
Elasticsearch
开源分布式搜索引擎,提供存储、分析、搜索功能。特点:分布式、基于reasful风格、支持海量高并发的准实时搜索场景、稳定、可靠、快速、使用方便等。
接收搜集的海量结构化日志数据,并提供给kibana查询分析
Logstash
开源日志搜集、分析、过滤框架,支持多种数据输入输出方式。
用于收集日志,对日志进行过滤形成结构化数据,并转发到elasticsearch中
Kibana
开源日志报表系统,对elasticsearch以及logstash有良好的web页面支持。
对elasticsearch提供的数据进行分析展示


. J0 V* M# r! d$ P" K2、ELK经典应用如下


  e8 |& E. h8 w3 S- N                               
登录/注册后可看大图

ELK经典架构

如图

  •   t8 J2 B* `1 C# H1 j
    ; c6 U% y9 |) c" u
    Logstash部署至服务主机,对各个服务的日志进行采集、过滤、推送。) Y( `1 W) T9 u$ A% v* O

    ' m; @+ _& E& b4 B# n* N* `: W

  • % @1 q( W+ d7 D) [. h2 V

    + F2 f; x8 T2 y2 X; R9 qElasticsearch存储Logstash传送的结构化数据,提供给Kibana。
    2 N; Z- p; \/ r( d" j

    - L" e* z3 }5 R; M% ?" ]

  • - {! z1 s# o7 F+ O8 s
    # S- A" c6 S" b# T" p( c4 T4 p
    Kibana提供用户UIweb页面进行,数据展示和分析形成图表等。7 \, `1 Q" n$ I6 p8 O

    ; s7 U1 u9 l9 t6 ]2 _
    ) x" `$ P( D# }6 W) `2 H
备注:logs 泛指,各种日志文件以及日志信息:windows,negix,tomcat,webserver等等。
8 V$ a1 g) \5 P, ?# S

3、ELK改进

由于Logstash消耗资源大,而服务器资源相当宝贵,所以引进另一个轻量级日志采集框架Beats,其中包含以下6种

Packetbeat
用于搜集网络流量数据

Heartbeat

用于
运行时间监控
Filebeat
用于搜集文件数据
Winlogbeat
用于搜集winodws事件数据
Metricbeat
用于指标
Auditbeat
用于审计数据

% z. |8 F! C3 q                               
登录/注册后可看大图

$ x+ b1 x. e7 Y' f9 {
改良ELK

, y6 r9 i: B6 A1 s$ p$ Q( m2 ?$ F& e* _
, ~% u8 u( i7 P

4、进一步思考

传统web项目中,经常使用log4j以及logback(性能更高)等成熟日志插件进行日志的记录,是否提供更好的解决方案。


- h; z: S: ?/ m/ O7 W0 y9 \                               
登录/注册后可看大图
& \. L2 ?' E7 Y+ e- u" U

ELK升级1.0

如图

日志采集新增Logback直接发送日志到Logstash的形式。如果采用此方式,web服务可减少部分生成log文件配置,提高实时性和日志推送效率

5、高并发场景

由于logstash消耗性能,所以高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,所以可以添加中间件进行日志缓存处理。由于logstash数据源具有多种方式,所有中间件也可以很多选择,常见的有kafka,redis。

3 y0 a6 y& ]' \
                               
登录/注册后可看大图
( Z( r& B, \' G; h- m

ELK升级2.0

如图


  • 0 I+ j9 |% b) ^0 R5 C; ^
    ' D" h) F/ i" }1 s' M/ L
    host1、中间件、host2 均为高可用服务集群   为简单显示未画出
    ; c: N! X& w  s) G% e
    % @! B$ h) g. {& w% Q
  • 1 b8 k- ?7 J' I6 U# U

    ( @' W5 j- C1 Nlogback出现的业务数据可以通过写入redis或者kafka等中间件进行缓存,再通过合理限制流量阀值输送至logstash进行过滤
    1 a2 r' }* f+ F9 [! C& x. n9 D) q. q
    % D, {: L3 m4 L# O+ ?4 L
  • - n% f7 g5 t* I3 v! F

    1 ^2 s+ n; U1 D4 p- Qbeats 如果是filebeat其日志若无实时性要求,可以通过控制log文件更新速度限制Beats传输日志流量/ D: g& i0 P# k( ]/ v

    % m% D& E+ x9 R, K0 v% ?
    * E5 j; x2 x+ h2 \
* V9 i: z4 U9 b* C7 D
三 ELK搭建(非集群)

1、下载ELK(保持版本一致)!

Elasticsearch
Kibana
Logstash
Filebeat
备注:演示为centos7 即linux版本,请按实际需求更改) j" T0 s0 Q" p2 ~- J

通过rz命令上传至centos7虚拟机
; F' B6 q. _) i* _! K. n. P

; w: Z% ]1 Q: b
                               
登录/注册后可看大图
( Z# ^. B( z* \4 Q" ]  t

. O: l: L! ?9 \, k0 l
; X4 {: c& C  ?+ M- s+ I- V+ q4 T
                               
登录/注册后可看大图

& n+ d8 O% ?3 j& X
9 q2 V2 e3 \% o( X- @

2、解压


  • 4 l' W$ j! b& K0 F

    2 B" C. [2 m* p1 T; |7 Z3 L! J& atar -zxvf elasticsearch-6.3.0.tar.gz          9 U/ `4 j% s6 R: H* p0 b
    & ]3 ^  u% x. T8 e# w
  • 5 t  V; e7 q+ y* }: _5 l

    ' z4 A6 d# K- p! H+ Etar -zxvf kibana-6.3.0-linux-x86_64.tar.gz( f7 \6 ~% F( f. y4 X' r5 A

    : r0 @) @' M" e  r8 @  G; O
  • . ]) `: r1 \' b

    # h- H4 D0 G' a3 M: B8 u6 {tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz  
    1 h3 T2 x# o+ H( x* U
    / V. k! ?, I3 V5 |/ q3 R* x! ~! C" Y
  • , \# K# B. \" |

    8 }- W) w2 X0 A2 e, r; h$ x  }tar -zxvf logstash-6.3.0.tar.gz
    7 a# m3 t1 h# P3 f# k# `' e) o

    - L& D# u. T7 i0 V+ b3 V9 v, @9 I9 ]: j6 f; t7 n
备注:tar不支持指定解压目标目录 可以通过mv 命令进行迁移。本教程迁移至/home目录下

3、java环境搭建

推荐使用jdk1.8jdk环境配置

4、安装elasticsearch

修改配置文件

vi /home/elasticsearch-6.3.0/config/elasticsearch.yml

  •   d% I, z# r# T  N

    4 X3 p$ s0 ?8 P9 }8 U8 u. Y# ---------------------------------- Network -----------------------------------
    " C/ Z, g, H9 M! Z0 R5 p) U
    . y0 g& V! R2 O3 Z: I7 f& B0 s7 p7 \

  • 6 t# t$ V; F0 _8 C6 D! {* E
    / d/ B. A) [" X( J4 \' e- N
    #% w- Z( E( ^( d2 B; G6 P

    / l" y* J) ]% P% X

  • . B/ k% X" c0 z1 L& d! P( I
    1 O+ {8 ~- _* ]# |* O- l& g- l, z
    # Set the bind address to a specific IP (IPv4 or IPv6):
    + a  @; G5 H. ~- O& O0 z0 e5 X* \
    6 Z* u, `$ K: I- i! h

  • 6 b) Q; Y2 ^8 Y% G  h

    3 E: t2 j5 E2 }, ^/ R4 M0 Z#( b' t% h- `6 b: Z3 Y6 B- T
    # v4 D* ^. d0 \) _& a( Q
  • * x* A5 G/ K/ |- r- L+ b& X! C& P
    7 k1 i7 k; |8 W6 U: l8 C- q
    network.host: 0.0.0.0           ##服务器ip 本机
    " w$ L1 o, _& f2 B3 k4 v- F
    * a5 y, }1 b  S* [4 |( ]$ I2 d5 K
  • & D5 x# v, a5 X2 O7 E5 z

    0 Y- B1 L" g8 X$ U2 P$ n#0 s( f' I. z! c; S' M1 A
    9 I: N0 G* u  D+ y5 N
  • + B# d! e3 K8 o0 v" H$ g

    ! O( g4 l0 i$ ]) ?( h3 |+ A* J# Set a custom port for HTTP:4 t6 Y* O2 j6 `! {
    ( ^7 h6 C5 y# v4 M+ i  m
  • 7 l9 x9 C$ T/ O1 j) ~
    - q! Y9 ^- P+ `! y- b9 L: v- g: l- @
    #
    2 t) V- @3 |/ D6 X; [

    & c# B- m3 m% G) U8 f& J$ B. @" j6 h
  • ; _8 O" Y5 u/ Q  s1 X; U- d3 t! X

    6 o8 W: D9 x+ ^  |http.port: 9200                 ##服务端口5 ?: s+ d- p8 p: r2 ?6 Y) `" ~
    # S; G3 l4 V5 Y" ]7 |8 g* t

  • , I, F, r9 `1 e) h: i

    3 R& g: a! o7 L8 l6 ]: P# F5 c2 m5 Z#
    7 u% Z! t2 P6 e* m+ {3 F

    . W6 A2 i7 |) _; |

  •   V& t/ Y" `% T5 K

    8 a5 o, k; U3 U$ q7 F# For more information, consult the network module documentation.  w, ~% ?( @$ `# P* R9 Y
    0 }8 ]; ?; L5 z, X" E3 k8 y

  • 7 Y$ x% l; B: z

    * @5 ^/ O) Y: S' }! Q# H#& D0 w  F! Q1 Q* w

    . i7 a" ]  a# H
    ) I9 L; }& o) S4 k0 }5 w. X" M

启动elasticsearch

/home/elasticsearch-6.3.0/bin/elasticsearch   #命令窗运行/home/elasticsearch-6.3.0/bin/elasticsearch  -d  #后台线程运行

关闭elasticsearch

ctrl+c                                   #命令窗关闭

  • 8 B: {: j1 f  H8 j) c* g
    , H( M* t& u; b* T5 n/ Z5 ^  ^3 G
    ps -ef | grep elastic                    #后台线程关闭
    2 ~3 N& @3 }5 _8 r% |9 q

    5 [7 N3 J4 E6 v% M: W7 Z" o4 E
  • # f: b* `# _" N

    : s* u  @" {! l8 ]( d% m8 D, hkill -9 4442                             ##pid 4442为查处线程的pid
    ! B. v# R. y1 c! F3 A$ v; Y* k# m0 p

    ) j" m$ I4 \% r" s6 y4 x1 K/ y, a3 q# Q$ b$ P

/ t9 r, U! k+ c! X4 @) z
                               
登录/注册后可看大图
6 ^* C  v* b7 W" _. j# w3 K5 P

常见问题解决elasticsearch启动常见问题

验证elasticsearch启动

) l: q8 H  P' e" B* P; p
                               
登录/注册后可看大图

/ C! S+ `4 |0 P% _8 e! q


" P7 c' p/ i" M

5、安装kibana

修改配置文件

vi /home/kibana-6.3.0-linux-x86_64/config/kibana.yml
  •   L: j8 W' e2 w5 X$ a/ y$ m- m
    : Y! P+ r  g2 j( z
    server.port: 5601       ##服务端口; i0 S" ]+ ]9 ]& l. N

    " B$ G9 E6 X0 M; G2 U* I9 B/ D# A

  •   k/ P% W4 s7 K; v6 w8 Q$ K
    / V% K' {6 K' N% q# B# J
    server.host: "0.0.0.0"  ##服务器ip  本机
    : l* H* v0 `) i5 U# R) P

    " A. v- V' E0 q9 \7 ]

  • ) x5 U, Y5 G& N+ w" T4 G

    6 M) e& y9 l$ D/ X0 s1 |7 ^1 z) q3 }$ Q4 |; i: o
    , o0 f3 Q# Q! c
  • 7 ~$ O9 j3 d; V  v8 ^
    1 b* o! I& |; V9 `
    elasticsearch.url: "http://localhost:9200" ##elasticsearch服务地址 与elasticsearch对应
    $ I' E: Z' b4 E5 W  v

    % l. m! O2 k) C! K& q" O
    7 P& _0 I9 d% w7 E$ G
启动kibana
% \! P% F2 U1 u8 Q9 J* _
9 c0 ]  R" C! O% c0 ^/home/kibana-6.3.0-linux-x86_64/bin/kibana       #命令窗启动nohup ./kibana-6.3.0-linux-x86_64/bin/kibana &   #后台线程启动

关闭kibana

ctrl+c                                   #命令窗关闭

  • 1 L+ O1 N# b* Y, w/ ~3 r
    0 L# e" i$ ]" b( j5 c
    ps -ef | grep kibana                    #后台线程关闭# `4 k2 q& R) F, p
    . A2 L, I/ n; K% c8 k8 l4 R: f

  • 8 A1 U' Q0 V0 \1 h* X. f/ h# A
    8 @+ r! s! I5 e  _* i1 G) a1 x
    kill -9 4525                             ##pid 4525 为查处线程的pid ( W1 U! }6 U5 e; z
    9 h6 m/ y+ O. ?* @' z5 k/ g+ S
    7 B/ D; K  e3 z# `6 Q% a6 [3 E' u2 c


. |  I* o! ?' N* x0 Q- g                               
登录/注册后可看大图

备注:常见问题多为 端口占用,以及目录未授权,需要同elasticsearch 使用目录运行执行的用户去执行 未配置则为root用户验证kibana启动
) T5 u. U% o8 s; s: H5 {* I+ r2 d- s
0 q& W9 X% M8 G5 G$ Y
                               
登录/注册后可看大图

& R1 J7 Y7 e9 Z- n2 Q: D$ U) E1 e7 x& K

6、安装logstash

新建配置文件

vi /home/logstash-6.3.0/config/logback-es.conf

  • ! D: X7 z# G8 z0 A7 j$ I2 o

    , p1 q3 M( f2 _# ~. `4 ]' y1 Zinput {
    4 B3 g2 p9 u1 t2 x
    # j( Z6 g4 D8 j% Z. P) b9 \1 ^& H
  • # p9 Z3 b- o; \+ P. ~1 h
    ' K5 t2 Z' m8 N; M- h( O7 `1 ~
        tcp {  
    # ]. x* ]4 X2 c0 {! x& Z
    2 S0 w6 A' d5 D8 V7 Y! `

  • " h) d3 d) ]5 [: S" ~. y
    + a7 W  D+ [* n
            port => 9601  
    5 ?6 t( [+ n3 R0 Q) g
      _$ r/ G7 Y% ?9 ]* s
  • 1 f  L2 @6 J2 M7 w! W8 Q
    4 a3 i% _5 f  z$ f
            codec => json_lines         
    1 n+ l3 O0 s9 a4 o% v/ [
    / d- }6 S) N0 u7 v0 o9 a1 P; ?
  • ' i% ]( W2 K) y1 D; J2 q% H
    7 |1 t  Q- X9 Y, d+ z
        }
    . A, V) ?8 I$ t, w

    0 `. P0 d: g- a" o" D

  • 5 s6 I/ N9 g. B3 b

    # f* {$ U$ u' V" Y7 g2 a2 Y6 x! m}
    5 i' P/ |4 R) D5 M+ I# X+ a
    & N1 z) Z; }! J' l

  • . X- s3 d+ Z. L

    ; g, }7 ~6 M6 H+ I0 A* \2 I7 V, z% z5 boutput {
    # Z7 s8 f. y; j* K! u

    $ w# Z/ N. @0 K8 ~5 g# K% F) f

  • ) K3 t. ]4 K6 U; g) m6 S: o' @" f
    # j6 f. U2 w# _- b: d
            elasticsearch {
    8 W# E. j) l7 u

    1 }- E$ P" v& r; J. x, ~" v
  • $ b! P. \2 D5 ^9 H/ P

    $ H# k; T1 s6 D- H% R* b; s                hosts => "localhost:9200"
    ' p6 A- P8 w9 c9 E# ~
    ; N5 ^  g7 Y' \: ~9 z0 A7 \

  • : E' u6 I+ R9 H! ]- J1 ?: C/ Z7 n) j
    $ S  l7 Q# l( ^* X
            }  \5 x& W: `/ H3 I! I/ a7 `  O, z
    % h+ d! M) H% }8 b. u% v' ^& K

  • - T' q2 ^' J% M- |

    6 `0 m$ G& G; j7 d/ w7 u/ `        stdout { codec => rubydebug}' I! q. K  k$ f# y4 u
    1 V! ?# Y1 t# X6 l: x  ]5 C: |4 ]
  • ! g3 I$ A5 y! N; b

    9 _1 l, }1 q/ m6 n8 s}# @' V3 k, T+ N0 y

    1 |2 U8 H  @6 g4 q$ U
    + u4 w+ F( A# Q) H) {; a
备注:上述文件复制时必须去除多余空格,保持yml文件规范。8 B2 K' s) F, N( w


) o2 U- G  u5 g5 B$ f! T5 c+ v$ f                               
登录/注册后可看大图

/ t( l2 x7 X1 }% i/ m, z

备注:上图与配置部分一一对应

  • 0 ^. R3 ?  g: q4 H

    ) x/ @/ C* ?4 o2 N0 U, c7 oinput {                                ##input 输入源配置
    $ a7 o' g0 q0 j1 X
    , y7 N& u1 C9 d1 o
  • 5 j4 y1 G0 a4 ^  \, g2 g

    ) ?+ t$ q1 ?. \* ~7 X5 }( l7 z6 {    tcp {                              ##使用tcp输入源      官网有详细文档' L9 M0 ]8 L5 w$ F% |4 V

    % ]6 _) m+ g* \% u7 W! n

  • ! C6 X! R+ f, D$ Y

    / k3 P  D. k0 p# W5 `- e4 u        port => 9601                   ##服务器监听端口9061 接受日志  默认ip localhost2 Y4 K, Y7 y8 q7 r4 b/ ^

    2 J7 Y3 A) F7 A8 C. j, x* X
  • " k8 x4 i1 `" e" y" n4 L& g

    + w0 C6 M8 K9 C( b0 R- k7 ]        codec => json_lines            ##使用json解析日志    需要安装json解析插件* O0 Z- z/ k% n& J9 s3 ~: k5 X

    1 Z5 e6 m0 s9 J0 [

  • 6 F2 a5 b6 \$ J9 i' d+ D) \) c/ D
    - i1 `- n, h( x1 v  g( \
        }
    ) r# o- q4 K# S* e+ a  C2 J$ N7 e6 \

    % }! d, \; Q' s8 M: t7 N* F2 b1 n
  • + {- T4 M4 ~. K" t# n9 x$ j
    9 C6 X4 W7 v1 @; t" X. ?
    } $ K, _/ n1 E) S- t4 P, I

      u: z# b6 s1 X: b
  • 5 W- h8 |7 d0 `2 w4 m; u2 J6 z

    ' I- `) @- T3 Nfilter {                              ##数据处理
    5 d/ [& @! p0 {  h1 V% P

    ) d8 T3 g: V/ {  i; G
  • . M! S$ N8 W1 F2 @

    . l( J' t- x4 W  n}                                
    - Z1 R0 {: W& M  ?8 ?! r" v
    # T5 Q# `4 b6 |# S- k  O# Y1 R5 G- [, f
  • 7 D, ?) g; [4 c0 [
      V& n8 I- O$ b0 O6 W2 k
    output {                               ##output 数据输出配置
    " F) N- h- R' S% E

    * A  w. K* Z2 h: o  {
  • - L) h! M) ~8 \, ~# c& i

    6 i( s1 d6 j& O9 h        elasticsearch {                ##使用elasticsearch接收
    . L& |6 `! Q6 H( ^. D. k9 e

    $ B, M) a7 N% W4 R

  • 5 t' ~6 {1 W' \) I

    9 W- A* y; n1 z! v# p, Z            hosts => "localhost:9200"  ##集群地址  多个用,隔开% l8 \( t1 d6 Y0 y6 ^7 `
    * s# I& W  \$ H& b

  • 8 K' t* [: O: x) E/ J

    " m# B0 c- K! c# P7 _* l/ n" i5 X        }/ Y. i) L3 s7 Y- Y0 ]
    / _9 S$ Q* m9 B& B* R4 V

  • 8 T( e! r) }6 F$ g" x
    7 Y/ F: r: q! O. f. W  M. N1 h) }
            stdout { codec => rubydebug}   ##输出到命令窗口; e- u0 _+ t, p1 J/ T. h; c

    ' i; }5 }9 b7 f' Y

  • & N% c" l) N2 H! k
    6 @: o0 R% y: @' |7 p, n1 y
    }# @* v/ _6 D( E5 u3 a" F

    * L& M) Q1 b5 }! t" d4 t. s
    2 n7 X5 p, S3 Z3 z% K* r: `

logstash官方输入源支持以及下载

安装logstash json插件

/home/logstash-6.3.0/bin/logstash-plugin install logstash-codec-json_lines

启动logstash

/home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf         ##命令窗形式nohup /home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf &  ##后台线程形式

" i/ s2 C6 A0 l
                               
登录/注册后可看大图

关闭logstash

ctrl+c                                   #命令窗关闭

  • 0 ^" H+ V) h# }1 A" b# \. g
    3 ]" G) V7 J: c3 j& y# b
    ps -ef | grep logstash                    #后台线程关闭6 ~( M4 Y. b3 u' `! {" ?; u
    / H( M0 c/ q  w9 R3 n

  • 7 V! V0 H, S9 k% I3 A
    . Y) |* [; ]" h
    kill -9 4617                              ##pid 4617 为查处线程的pid . v5 k# i6 O- B5 |+ G0 A2 D

    : s) Y* ?" d% Y4 {/ ]
    * d$ ^$ f! b/ X# G- J
6 ^2 t( p$ S9 J! _5 j
                               
登录/注册后可看大图

) ~7 j3 a/ X4 H- O5 n3 m9 ^6 m( ]
6 y1 ~) }% O1 @6 u

7 使用logback 传输日志到logstash

建立springboot项目(为了快速使用)

+ W0 e6 [6 C+ T8 G: x
                               
登录/注册后可看大图

6 c2 q( z7 I( [& s& t8 |0 O3 ]- A( h

pom文件依赖

  •   k) F% Y6 I$ w" O; M: H

    4 f: Z; P) W2 ?$ o- B5 l               <dependency>
    2 q2 Q' z4 g( B  `. E# \
    7 C  n& F2 m# h
  • - N: ^: s) n- u

    1 ~% X  n, U% _) |$ e                        <groupId>net.logstash.logback</groupId>  D" D/ @: U1 J' e, b% G- s

    $ }* f  m: `. n, x  \

  • 6 d. z+ l+ p) y7 ~2 k5 W$ D" j# K" Y

    ) c8 a& i6 W/ k' H3 g! j                        <artifactId>logstash-logback-encoder</artifactId>
    : \9 I# X/ h9 _3 e0 F0 o( N

    $ m& J" n" X+ k# P3 J3 Q) V4 l
  • " G3 i) \3 E& i. m
    $ L1 y+ U8 W- d4 I& l1 e0 A
                            <version>4.11</version>2 G/ X3 ?5 y8 {8 V" e

    # `- ^6 }8 i; i; |

  • * [! e; C$ ]/ x$ N2 \0 v- ]. a( c
    * Q, w; {5 V& n, a/ @
                    </dependency>& q2 x. R) |/ r
    " d6 I7 z7 H$ i# [9 c
    3 a8 x, r( G7 p" N' {8 r" u* B

logback.xml

  • 4 W1 x* ]/ j2 `
    0 T0 C: n) A: k; a! V" d6 w
    <?xml version="1.0" encoding="UTF-8"?>
    # E2 C. z' N. T' j8 o4 {
    + S9 V5 e8 q: e7 ?7 i+ j

  • ) B, I) y0 X9 D

    : f6 Z/ u8 p0 M- q! y<!DOCTYPE configuration>. A0 W3 \) \/ f8 ]

    3 E8 o# n) D" A: S7 y; W5 p
  • + f$ U$ d, u" P( |

    - j4 x& \, S! N* t<configuration>
    1 H6 c" a4 R; G
      C& F( c/ u  e) s* r

  • 5 B" T  ^0 k2 U

    ! w/ L& S* X' P! y, z    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">& Y: f5 {. @) ~! F
    # _: d0 J. u; y3 |
  • 4 O3 F$ @1 `( T  u0 ?
    0 o( r/ f; G  p" U# a
            <destination>192.168.253.6:9601</destination>     <!--指定logstash ip:监听端口 tcpAppender  可自己实现如kafka传输等-->! F: @2 p6 Q0 ?0 ~( k2 L- q

    6 V# \) X% R* c+ [- @8 u, n

  • 7 r: c+ }3 m% t* I  y' v

    0 |- y; c" U& q4 Y        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />0 M" _, j. x8 E& S

    ) d+ o, S& @1 S

  • + Z  Y; r) k6 V. j+ Q  X0 {) M
    ) T9 I1 Z8 v3 y0 o
        </appender>  A; o5 x$ A( i  n6 n  \$ l
    * m4 Q% i* P" b" j7 B

  • ! |! `/ o, C4 h! l3 x& a1 d
    5 p5 b! d$ ]4 b+ |4 d; n

    : X. |% J* P2 B5 W

    - Y( E6 F4 Z/ \* f. X8 n; D$ g

  • . {2 s/ _/ h; f& Y5 c& n0 Z. m" C

    $ S& D9 g- T  e7 K. L- n    <include resource="org/springframework/boot/logging/logback/base.xml"/>      <!--引用springboot默认配置-->
    1 E2 ^. x7 i, @4 m( G2 g. u/ G
    " s- w; A0 Y' Z4 S3 `9 ^
  • ! X' l3 ]4 ]! P" z* K

    & R8 m: C8 `* X1 |8 [* Y
    2 w  Y1 I  R7 Z5 ?) I
    ( F7 c5 |) x. A( j+ L9 ~# N

  • 5 T7 P' @9 s  D4 c1 l

    . v' W  ~5 ~/ O. N$ a, S    <root level="INFO">* x  l1 K/ I- k, ?& B

    : {) d! d% a0 u/ s6 S! C$ U

  • + ^9 b, L4 c" ~! f

    1 W- J. y. d' [& w. p+ N/ J        <appender-ref ref="LOGSTASH" />                                           <!--使用上述订阅logstash数据tcp传输 -->; G+ ~# C3 T, L9 j& o+ Q% T

    , Q2 ~* w5 \5 T6 L
  • * d) f6 M8 C  O$ F  i

    2 V! b0 q! i, |. }0 _        <appender-ref ref="CONSOLE" />                                            <!--使用springboot默认配置 调试窗口输出-->
    8 X6 ^" l+ j5 \3 N* k
    3 C4 x3 n" U0 @7 G

  • 0 f  N4 ^" |6 {- e, @& J0 N0 R* o& C

    8 ~/ ]& b! o+ }    </root>
    6 I6 h) ~8 {/ W- b+ T, {' N

    9 {+ L% ~$ n: N. ~
  • 6 g7 W6 U) D/ d) |9 j2 L6 N
    5 g( Z( ^  \5 C* k, \( }; J/ t( H0 q6 K
    9 \/ }0 {$ ^7 c7 ~7 f

    , W: e: a1 H6 |
  • ! z1 U* b% y( Q# K1 q
    2 Y* O( I! L3 T; F6 ]
    </configuration>
    . V  d' B' z; }9 u/ h/ k0 y$ x0 }

    # S- ]! s0 U9 ]3 {: f# b! K6 t# l2 Z- ]2 p
SpringbootLogbackApplication.java 测试% \; o0 {( P% C; q, \1 _8 x
  • 0 f8 D* Z$ s( k+ p
    5 L) F* u/ ?& X* y- L3 A. H8 f- ~
    package com.zyj;
    ; H' [3 z8 A% C
    : y  D5 d$ w/ J; P9 b

  •   T" q4 j1 ~2 e6 o- Y

    " r4 H, D5 i) {+ Q5 s) Q* v
    8 `8 d( c& E1 Y$ Q# J
    # M9 k$ B: K% w; k

  • : @# \& y$ U) F' H2 H" v! Y. [6 |7 s
    ( I+ k% I' w- x& q6 G# o* _- }
    import org.slf4j.Logger;% _- j1 D9 ?' G4 w$ s

    0 s+ M5 D  [- x( z9 e: F; |

  • 1 W/ n) o- d" Y. }
    $ f+ v& f* y- f1 q
    import org.slf4j.LoggerFactory;7 \- f) u' ^0 l) t; f
    6 C8 k5 {* `5 Y; P, G
  • * m$ J' N) a4 A/ o: P
    , Q8 J6 E$ o, w5 w
    import org.springframework.boot.SpringApplication;6 `4 Y/ T7 x$ A, m& l# Z& s
    8 a- z! Q! O1 x9 H* t
  • ( ^  [. ?/ E, n2 Z( O% `+ K+ b4 ?

      g6 J  o  `+ ?( ]1 Timport org.springframework.boot.autoconfigure.SpringBootApplication;
    1 h- W5 f  c% F  j3 D! \- l

      m. I5 b1 S5 z/ @- F
  • ' b7 i9 i2 g9 z+ }7 Y

    ) R" I1 e7 N% x! W6 b% r' j7 M  c  V, w) v
    , L) m2 O0 X7 H$ B

  • ) C% Y# b& a$ l4 p& R$ j

    # o, t  M; c9 B# m' y; _@SpringBootApplication
    # n  I" Q! x' ]" |; ~
    ' v  L  C' J4 _7 Q
  • / d* w7 F+ F6 O+ Z4 i

    1 i0 |5 d( v4 F; m% x- C' Vpublic class SpringbootLogbackApplication {
    9 y' _! Y9 i% p4 P2 i
      W2 `% r- C- P1 A( u0 n

  • / {" F( p: q8 F- o

    ( y! Q: x3 D7 N  Z# `        private final static Logger logger = LoggerFactory.getLogger(SpringbootLogbackApplication.class);
    / b  @* f% O, [1 T2 n
    . d4 _: G1 `5 h# m" X

  •   ]) \4 `, n) Y- n1 W+ G/ p

    : W! L: j6 G8 x+ o9 v2 q
    , }  \# t5 [  q
    % |* b* c! q- G8 g9 ~/ [2 r

  • * j8 l  \) W) n! W8 C# E! @

    * B# @2 q# d6 @3 m4 n        public static void main(String[] args) {8 F7 e2 f  t8 I1 |

    % D+ [2 h3 A) X3 Z" k+ I$ a
  • 8 i* O/ Q% e# T; P" n0 \) y

    . J% n) P7 S! W' k9 k; Y% P' d! Z                new Thread(()->{2 T8 z- _5 n5 }$ y/ M# a. h

    & t. i5 N1 G+ q- K0 o

  • 6 s+ S' p% [% m" J5 K# E3 [
    4 i2 ?1 q7 |5 p: C. S
                            for (int i=0;i<100;i++){
    8 G: @8 C9 H. |$ n8 ]

    2 C( ^- T2 O. r8 j8 ]$ D, o& p* D0 d

  • 6 b$ \" q+ f2 J. J2 Q" G
    0 Z6 H4 @, o5 {9 d& H
                                    logger.info("---test---"+i);
    $ w/ y1 ~# T) I' a
    / o* f  f+ K: J) v4 s5 t
  • 0 Y% d, l5 O" r5 X" f# L

    6 h# }1 _: F! G* t7 M% L                        }
    * M1 r0 f# ^1 q

    9 y" C2 ~8 Z* F8 ?- ^0 Y& @
  • / u( Q3 n, O1 n; d' H$ e

    5 d; r7 A" o0 C" C2 V4 W3 l, z  C                }).start();, `( x& [0 ^4 }9 v
    $ p1 p; ?/ r( s1 m' s' ]
  • ) D- O) Q) h' B8 |. n+ k/ m- a

    * I, F, L2 ~4 c9 \
    ' a( [0 S4 ^* o- c6 G2 H
    9 X3 s6 n- U) i% F. \% \  t6 }
  • ) a" @7 D( U  u$ u5 r
    + m( P' v/ _/ j2 M
                    SpringApplication.run(SpringbootLogbackApplication.class, args);/ w3 @) P# s) O( p2 y7 \8 A$ I

    " g% s9 U& C! f$ E. c. X

  • 1 L  I* F; T. b! {( c9 L- s1 l

    , s0 U- V1 x& ^2 B% l6 f& L        }
    * b0 `( }% N5 M+ T) d. Z3 t7 f
    ; V8 z/ E) u- g$ Q, P3 u

  •   A5 v/ M/ J6 W: g: M5 F

    . G: s) N2 S9 F5 ^}3 Q: Z% K0 @; J9 j/ w) z
    : V# k  Y; Q: `( t* K  T' u) P
    " `% S0 q, O; I4 o( }

9 验证ELK

为演示方便,我们简单展示一下,单位时间线程打印某日志的速度。主要通过kibana过滤出结构化数据,通过以数据的时间戳为x轴,以count统计函数为y轴进行图表展示。

(1)后台启动elasticsearch  kibana logstash 并验证启动成功

(2)启动springboot项目


9 E5 p# K0 h' R' [                               
登录/注册后可看大图

- b. K# j7 `: C: l1 K

(3)logstash输出控制台记录  此为默认无过滤器打印logback包装的全部信息


, y! E3 k( ]9 P" R1 S% Q8 n9 F( A                               
登录/注册后可看大图

(4)kibana日志显示

添加elasticsearch日志数据


9 b, |7 W+ S0 l- [& W* e                               
登录/注册后可看大图

3 _8 S/ y% m: Y. h4 \: Y$ w  X

使用时间戳显示 单位时间线程记录日志数量

& m7 e9 f& i2 o: ~# w& P
                               
登录/注册后可看大图

2 A- s4 c, W) Q; [; K

四 、思考拓展

1、本文未详细介绍logback详细配置,以及自定义日志传输,将后续写入kafka以及redis方案,log4j亦可以使用elk因性能问题不做深究。

2、本文未详细介绍elasticsearch,logstash,kibana,beats的详细使用,仅罗列架构以及初步elk使用。beats常用为filebeat,对已经生成文档的日志进行传输。

3、没有完美的架构,只有合适的用法,针对不同的业务环境需要对架构进行微调,整体思路不变。elk为单独高可用服务群,服务器群与beats或者logback亦是独立高可用。

4、根据业务需要,在logback打印的日志中可以进行结构化处理,亦或者在logstash的filter中对数据进行结构化处理。业务场景有待考究,初步考虑异常分析以及sql回滚等。

 楼主| 发表于 2018-7-12 16:28:15 | 显示全部楼层

加上个人实践意见,及如何避坑

# ?- A) v4 V1 `4 h/ \. a

请不要用log4j2

不然不成功。我的版本就是这个结果

/ p4 E, t* y) F2 p: q9 ?

没有图片,图片参考下面的网址

http://blog.csdn.net/mchdba/article/details/52132663- c. Z4 k* g( V" q2 U! r$ R; d


. G0 W3 N) N/ L$ o6 T. k1、ELK平台介绍

在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段:以下内容来自: http://baidu.blog.51cto.com/71938/1676798

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

& o5 k9 K1 o. F8 s

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。


7 G* m+ V. R8 K. m8 f* P

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。


1 B) \6 o; V/ T1 m

开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站: https://www.elastic.co/product

E:\u\elk\pic\01_1.png


/ Q6 Q9 M' M5 S9 {1 k( }, N+ _& Q& T* L* i! r# D, w) t% c
. q" [7 J5 f$ G, M. u8 s! z

/ @( X* S+ `. B2、安装准备

Elk平台环境

系统

版本

服务器操作系统

Centos release 6.7 (Final)

ElasticSearch

2.3.4

Logstash

2.3.4

Kibana

4.5.3

Jdk

1.8

注:由于Logstash的运行依赖于Java环境,而Logstash1.5以上版本不低于Java 1.7,因此推荐使用最新版本的Java。因为我们只需要Java的运行环境,所以可以只安装JRE,不过这里我依然使用JDK,请自行搜索安装,我这里准备使用1.7


/ K/ o$ I3 f* J) U
8 E: G9 L5 n# v1 `9 E# d7 r  |% B
/ M7 v: v, s  N$ E' C5 L5 C4 f& ]$ [2 @
3、下载

官方网址:https://www.elastic.co/downloads,如下图所示:E:\u\elk\pic\01_2.png

, [; ?- {7 _' x9 Q( p

( x( B9 z& a. E9 e( L

从中获得下载地址:


; @) e1 I3 k" W' Z; h9 ~
7 Y0 e. T7 a8 m! K8 S+ \& ~6 B7 l. N4、安装调试4.1、安装jdk

使用root安装jdk

mkdir -p /usr/lib/jvm

tar -xvf  jdk-8u45-linux-x64.tar.gz -C /usr/lib/jvm

3 ?% b' b9 i1 p3 v# E/ `

# vim /etc/profile 配置系统参数
* S" p5 t5 v  d! q  Y* q6 ~. cexport JAVA_HOME=/usr/lib/jvm/jdk1.8.0_454 a8 p' B, H# U; b
export JRE_HOME=${JAVA_HOME}/jre! h" f# }1 Y$ f
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib5 U$ @  A% u! V' @! t' F
export PATH=${JAVA_HOME}/bin:$PATH

; ~$ j! u( T8 y8 d# p

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_45/bin/java 300

sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_45/bin/javac 300

1 v0 H1 i8 e) o% {9 F( D  E7 b3 U! D

+ j% v6 _: t0 h, t& Z- o4.2、安装elasticsearch

使用elk账号安装elasticearch:

# 解压缩安装

useradd elk

su - elk

tar -xvf elasticsearch-2.3.4.tar.gz

cd elasticsearch-2.3.4

* ]: M1 V' w4 m, d2 G4 v# f  H/ S

# 安装Head插件

./bin/plugin install mobz/elasticsearch-head

ls plugins/


% V$ `) h& G) r7 x$ A

# ls能看到head文件即可表示ok了。

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ ll plugins/

总用量 4

drwxrwxr-x. 5 elk elk 4096 8月   2 17:26 head

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$


& Z& M. |3 T  T# B2 h* t8 L3 k3 M/ x5 F2 g
$ \" b* m4 f& {

编译es的配置文件:

cluster.name: es_cluster

node.name: node0


; J- K" S% ]! `8 x) _

path.data: /home/elk/data

path.logs: /home/elk/logs

# 当前的host ip地址

network.host: 192.168.121.62

network.port: 9200

' m6 p. ]3 q9 k8 `" w  t- ~# e

启动es:

./bin/elasticsearch &

[Failed to load settings from [elasticsearch.yml]]

坑一

这里整理几个空格引起的问题.

版本是elasticsearch-2.3.0 或者elasticsearch-rtf-master

解决网址

http://www.bubuko.com/infodetail-1639745.html

7 J2 g! l1 \" M' P/ ?9 T8 o

看后台日志,发现它和其它的节点的传输端口为9300,而接受HTTP请求的端口为9200。日志如下所示:

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ more ../logs/es_cluster.log

[2016-08-02 17:47:23,285][WARN ][bootstrap                ] unable to install syscall filter: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled

in

[2016-08-02 17:47:23,579][INFO ][node                     ] [node0] version[2.3.4], pid[21176], build[e455fd0/2016-06-30T11:24:31Z]

[2016-08-02 17:47:23,586][INFO ][node                     ] [node0] initializing ...

[2016-08-02 17:47:24,213][INFO ][plugins                  ] [node0] modules [reindex, lang-expression, lang-groovy], plugins [head], sites [head]

[2016-08-02 17:47:24,235][INFO ][env                      ] [node0] using [1] data paths, mounts [[/home (/dev/mapper/vg_dbmlslave1-lv_home)]], net usable_space [542.1gb], net total_space [10

17.2gb], spins? [possibly], types [ext4]

[2016-08-02 17:47:24,235][INFO ][env                      ] [node0] heap size [989.8mb], compressed ordinary object pointers [true]

[2016-08-02 17:47:24,235][WARN ][env                      ] [node0] max file descriptors [4096] for elasticsearch process likely too low, consider increasing to at least [65536]

[2016-08-02 17:47:25,828][INFO ][node                     ] [node0] initialized

[2016-08-02 17:47:25,828][INFO ][node                     ] [node0] starting ...

[2016-08-02 17:47:25,939][INFO ][transport                ] [node0] publish_address {192.168.121.62:9300}, bound_addresses {192.168.121.62:9300}

[2016-08-02 17:47:25,944][INFO ][discovery                ] [node0] es_cluster/626_Pu5sQzy96m7P0EaU4g

[2016-08-02 17:47:29,028][INFO ][cluster.service          ] [node0] new_master {node0}{626_Pu5sQzy96m7P0EaU4g}{192.168.121.62}{192.168.121.62:9300}, reason: zen-disco-join(elected_as_master,

[0] joins received)

[2016-08-02 17:47:29,116][INFO ][http                     ] [node0] publish_address {192.168.121.62:9200}, bound_addresses {192.168.121.62:9200}

[2016-08-02 17:47:29,117][INFO ][node                     ] [node0] started

[2016-08-02 17:47:29,149][INFO ][gateway                  ] [node0] recovered [0] indices into cluster_state

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$

7 y/ _- i9 m; H+ }& o

/ @9 |  |6 C/ y& i1 E

打开url地址http://192.168.121.62:9200/,E:\u\elk\pic\01_3.png

/ E& l/ R! S2 {5 B8 M

( [/ k# A' G% g  [8 o9 }; S
/ ^5 j% e0 N/ G& V' j# @: M7 z; B, v

看返回结果,有配置的cluster_name、节点name信息以及安装的软件版本信息,其中安装的head插件,它是一个用浏览器跟ES集群交互的插件,可以查看集群状态、集群的doc内容、执行搜索和普通的Rest请求等。可以使用web界面来操作查看http://192.168.121.62:9200/_plugin/head/,如下图E:\u\elk\pic\01_4.png:

& j" c" R/ @1 }$ N* f; |: d& _
$ a) s8 g4 E* M

可以从界面看到,当前的elas集群里面没有index也没有type,所以是空记录。


  M4 l& ?1 s6 W2 ~  l9 e7 Z; [+ G* F5 X1 V/ S0 J, N. P8 Q
4.3、安装logstash

logstash其实它就是一个 收集器 而已,我们需要为它指定Input和Output(当然Input和Output可以为多个)。由于我们需要把Java代码中Log4j的日志输出到ElasticSearch中,因此这里的Input就是Log4j,而Output就是ElasticSearch。

结构图如E:\u\elk\pic\02.png所示:

, m2 Y& S" B6 |& \: G7 O* E8 a

安装配置:

# 解压缩安装

tar -xvf logstash-2.3.4.tar.gz

cd logstash-2.3.4

, V& M! G+ G- j6 Y+ O* J/ X

# 将配置文件放置在config文件夹下面

mkdir config

vim config/log4j_to_es.conf

# For detail structure of this file

# Set: https://www.elastic.co/guide/en/ ... file-structure.html

input {

  # For detail config for log4j as input,

  # See: https://www.elastic.co/guide/en/ ... s-inputs-log4j.html

  log4j {

    mode => "server"

    host => "192.168.121.62"

    port => 4567

  }

}

filter {

  #Only matched data are send to output.

}

output {

  # For detail config for elasticsearch as output,

  # See: https://www.elastic.co/guide/en/ ... -elasticsearch.html

  elasticsearch {

    action => "index"          #The operation on ES

    hosts  => "192.168.121.62:9200"   #ElasticSearch host, can be array.

    index  => "applog"         #The index to write data to.

  }

}


3 }: m) W0 ]  ~! C7 H0 Z9 d, T+ e' K

启动logstash,2个参数一个是agent一个是配置文件:

[elk@hch_test_dbm1_121_62 logstash-2.3.4]$ ./bin/logstash agent -f config/log4j_to_es.conf

Settings: Default pipeline workers: 32

log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Pipeline main started


4 B2 W  Y+ r0 O3 P4 q9 }

接下来,可以使用logstash来收集日志并保存到es中了,可以使用一段java代码来实现它。


2 T- |: W( w: s& ?1 C& S, h. \8 D4 D3 O8 I6 d3 I

要记得,logstash是一个收集器


8 g$ ?2 b7 o+ Z0 L# L) q! ~0 q. Z: V8 e
4.4、elk3测试工程

工程环境是eclipse,工程大概目录结构如下图E:\u\elk\pic\04.png,一个java类Application.java,一个日志配置文件log4j.properties,一个调度配置文件pom.xml:

1 X8 W% b* a5 T( D' i/ n( X$ l
; n2 c5 z9 ^. O5 }* v4 Q1 n( A8 C. I9 n

(1)Application.java

package com.demo.elk;

import org.apache.log4j.Logger;

public class Application {

      private static final Logger LOGGER = Logger.getLogger(Application.class);

      public Application() {

           // TODO Auto-generated constructor stub

      }

      public static void main(String[] args) {

           // TODO Auto-generated method stub

        for (int i = 0; i < 10; i++) {

            LOGGER.error("Info log [" + i + "].");

            try {

                      Thread.sleep(500);

                 } catch (InterruptedException e) {

                      // TODO Auto-generated catch blockl

                      e.printStackTrace();

                 }

        }

      }

}

: y' @% {1 G: s

4 }! P" h$ r2 @8 V

(2)Pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>elk3</groupId>

  <artifactId>elk3</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <name>elk3</name>

  <dependency>

    <groupId>log4j</groupId>

    <artifactId>log4j</artifactId>

    <version>1.2.17</version>

</dependency>

</project>

  Q& N4 u, [6 s0 [2 B* G
' @& b2 x1 v( b9 `% l' M

(3) log4j.properties

Log4j.properties,将Log4j的日志输出到 SocketAppender ,因为官网是这么说的E:\u\elk\pic\01_5.png:

  E6 i- r7 B% n0 J

3 l; r7 c6 T+ Y4 b* u7 U! `. N- @/ }# o

Log4j.properties文件:

log4j.rootLogger=INFO,console

3 |) B6 J, E7 z& S; c2 p6 p

# for package com.demo.elk, log would be sent to socket appender.

log4j.logger.com.demo.elk=DEBUG, socket

. D% R+ p3 K1 _* T  {

# appender socket

log4j.appender.socket=org.apache.log4j.NET.SocketAppender

log4j.appender.socket.Port=4567

log4j.appender.socket.RemoteHost=192.168.121.62

log4j.appender.socket.layout=org.apache.log4j.PatternLayout

log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n

log4j.appender.socket.ReconnectionDelay=10000

/ H' t1 G  m+ {& A- f# J

# appender console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.target=System.out

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n

9 \+ `! o, Z  m; b. \9 ~: x
0 ]& ~1 E; g" Q1 m5 u9 Y
  U0 x$ d4 z% f

注意:这里的端口号需要跟Logstash监听的端口号一致,这里是4567。


9 ]# L% _. R+ ~( I5 C9 l5 @( E0 E
4.5、eclipse调试结果

(1)eclipse查看调试结果

在eclipse里面允许java程序,查看console的输出信息(这个output只是为了做一验证,没有这一步不输出到console也是可以的),调试成功后输出结果如下图E:\u\elk\pic\05.png所示:

, T! _# i/ q: v  D& [6 N  k" h

坑二:这里搞完后,Elasticsearch没有展示的结果

这里我就换了一个log的配置文件,成xml

<?xml version="1.0" encoding= "UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

       <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender" >

             <layout class="org.apache.log4j.PatternLayout" >

                   <param name="ConversionPattern" value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />

             </layout>

       </appender>

      <appender name="socketAppender" class="org.apache.log4j.net.SocketAppender">

        <param name="remoteHost" value="192.168.1.128" /><!-- \u8FDC\u7A0B\u4E3B\u673A\u5730\u5740 -->

        <param name="port" value="4567" /><!-- \u8FDC\u7A0B\u4E3B\u673A\u7AEF\u53E3 -->

        <param name="Threshold" value="DEBUG" />

        <param name="ReconnectionDelay" value="60000" />

        <param name="LocationInfo" value="true" />

      </appender>

       <root>

             <priority value="debug" />

                        <appender-ref ref="ConsoleAppender" />

      <appender-ref ref="socketAppender" />

       </root>

</log4j:configuration>

。。。然后尝试了几次,就成功了。

$ n, Q  }. i5 X
# W9 ^3 w' r4 L0 T

(2)去Elasticsearch的head界面查看效果

去界面http://192.168.121.62:9200/_plugin/head/查看效果,点击概览里面,看到下面绿色的就是primay分片,下面灰色的为非primay备份分片,如下图E:\u\elk\pic\06.png所示:

9 Q# H) t+ E3 C6 y) q3 q. p! y5 Y) N
6 U) S; y1 n4 C$ t) T, I% q8 C

其中:

A:docs: 20(20)表示一共有20个文档,一个文档一个日志记录;

B:node0  表示只有一个分片,5个备份,分片暂时没有地方存放,所以显示为灰色Unassigned状态;

C:es_cluster集群健康值: yellow (6 of 12)表示因为有的分片没有地方存放所以集群报出了警告的黄色字体信息;

; f, r2 Q' P1 O7 Z% k

- \7 h. Q3 L3 u7 Q4 L! H

(3)去Elasticsearch的brower界面查看效果

E:\u\elk\pic\07.png


+ H/ J5 \: [/ T' ~5 L$ E+ |5 K- R, ^$ B) G5 L. l1 F# J

其中索引中的.kibana applog:表示是生成的索引集群,kibana暂时是空的,没有记录不遍历查询,而applog有5个分片记录。

查询 6 个分片中用的 5 个. 30命中.耗时0.054秒 表示:看到6个分片,其中有5个是applog,有30个是执行了3次eclipse所产生的log记录次数。

2 _' R6 I$ X% p
6 Q$ }, l/ I( S: L3 {) D

(4)查看单个文档_index信息

在选择中的单个文档,点击左键,就会弹出单个文档的全部信息,除了message是我们的日志内容,其它都是logstash增加的内容信息,新增加的这些字段信息涵义可以参考官网:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html的描述,如下图E:\u\elk\pic\08.png所示

" l1 D& n$ h0 e; i$ g* Z4 r
/ g* s2 L) r5 c5 a0 U) n  M9 ^

PS总结:上面列出的都是单个ES的head界面组件查看到的elas集群的数据和状态,只是一个简单的和elas的交互界面,并不能形成报表或者动态的图表,所以我们需要其它的专业工具来做搜索并生成图表。         

( j5 y& U& {6 z: r3 D

$ k4 R3 v  h- W1 U8 ?8 l+ }4.6、安装kinana

# 解压缩安装

tar -xvf kibana-4.5.3-linux-x64.tar.gz

cd kibana-4.5.3-linux-x64


/ ]! F1 _' y1 r2 u# E6 ~

# 配置   修改配置

vim config/kibana.yml  server.port: 5601

server.host: "192.168.121.62"

elasticsearch.url:  “http://192.168.121.62:9200

kibana.index: ".kibana"

! {! ]; A1 w" t6 J

# 启动kibana

./bin/kibana

[elk@hch_test_dbm1_121_62 kibana-4.5.3-linux-x64]$ ./bin/kibana

  log   [14:53:15.975] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready

  log   [14:53:16.021] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch

  log   [14:53:16.036] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready

  log   [14:53:16.046] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready

  log   [14:53:16.052] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready

  log   [14:53:16.064] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready

  log   [14:53:16.068] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready

  log   [14:53:16.072] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready

  log   [14:53:16.075] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready

  log   [14:53:16.084] [info][listening] Server running at http://192.168.121.62:5601

./bin/kibana

- D0 ]4 S& O  B9 k1 K
2 j$ R+ R" F9 K

之后打开界面http://192.168.121.62:5601/status 如下,E:\u\elk\pic\03.png:

' ?( @# J) B" n% v

3 ]3 }1 \  c2 B' V
% X, W8 _6 s% t4.7、配置kibana

为了后续使用Kibana,需要配置至少一个Index名字或者Pattern,它用于在分析时确定ES中的Index。这里我输入之前配置的Index名字applog,Kibana会自动加载该Index下doc的field,并自动选择合适的field用于图标中的时间字段:

再打开http://192.168.121.62:5601/app/kibana,输入applog,会自动弹出如下界面,然后点击“create”按钮保存下,如下图E:\u\elk\pic\09.png所示:


- G" N* o# u% ~" M/ `  M" s& c8 ?) _3 Z

创建完成后,自动弹出成功界面,如下图E:\u\elk\pic\10.png所示:

! `3 S3 i0 ]& a, x( K  n

0 N+ U" c7 ?" |* B+ |; ^
/ K( M7 v' P. ]+ P* Y4.8、kibana生成图表

选择左上角的“Discover”,然后再选择右上角的“List 15 minutes”(如果右上角默认的时间查询没有数据,就需要手动调整查询时间了),如下图E:\u\elk\pic\12.png所示:


; _1 K, G& J3 D- y# |; V; u7 N2 e6 v. z# S( ~8 k, R

' K" Y* x8 U/ ^: ^; P

这里为了看到数据信息,所以保守的选择了“Today”,然后会看到今天的记录,也即是看到的elas中的数据记录了,如下图E:\u\elk\pic\13.png所示:


, }# r4 M4 A9 Z3 l- w" E) m/ _1 u0 X$ q5 _$ \9 D/ B

# w2 W4 K' e. x  y7 @: \- Z

在输入框里面,输入info字样,点击搜索按钮搜索,可以看到搜索匹配的信息如下E:\u\elk\pic\14.png:


, w! W* u6 Z( h& A7 X
9 m9 ~! ?6 ?  k! \0 t( ~# p5 y2 S& i8 i3 b& ]: f" O9 Z

点击右上角的“Save Search”按钮,就会保存此次的search结果,如下图E:\u\elk\pic\16.png所示:

% `% L  j, D# L% P6 _
+ V. O* g3 S; a; E  C/ C. I% T

# k* a/ M, F6 n: l6 J- S

接下来去Visualize页面,点击新建一个柱状图(Vertical Bar Chart),然后选择刚刚保存的查询search_logs_save_1,如下图E:\u\elk\pic\17.png所示:

之后进入左边选择x轴为Date Histogram时间轴,显示为时分,间隔为Auto自动间隔,然后点击绿色的三角形按钮“Apply Changes”,kibana将生成类似于下图的柱状图,如下图E:\u\elk\pic\18.png所示:


( y! U$ K. L! M( J9 x' A5 w" V+ t0 B

然后点击右边的保存按钮“Save Visualization”,可以保存此图为search_log_visual_1,如下图E:\u\elk\pic\19.png所示:

* d* ~* l" t/ s' Q% `

$ J/ f/ L& m8 u- e1 Z3 W3 E; ]
+ z8 |% n9 |) q# t8 o4 l

然后进入“Dashboard”界面,点击下面的灰色背景的“+”按钮,如下图E:\u\elk\pic\20.png所示:


9 {; b5 }! d) y9 N- C- z8 y9 d& A8 s

然后选择我们刚才保存的visual图,就会展示出来上次我们生成的图表记录,面板上就会显示出原来的图表,如下图E:\u\elk\pic\21.png所示:

) B5 }5 B- \+ }% F* s

9 P( d+ `! X" u) b& G& t: {& j- B$ d, n( f$ @, r0 ]

如果有较多数据,我们可以根据业务需求和关注点在Dashboard页面添加多个图表:柱形图,折线图,地图,饼图等等。当然,我们可以设置更新频率,让图表自动更新,如下图E:\u\elk\pic\22.png所示:


" F3 I, ~" ^. U: \& u  [/ n. s
! W: V5 ]7 b& n$ q+ }" P4 H0 ]

当然如果设置的时间比较紧凑,比较短暂的话,其实就相当于实时分析的图表了,类似于zabbix的监控图了。

7 [. N4 a: l0 i' s

OK,最基本的elk平台部署和调试的流程就走完了,接下来就是各种业务场景的使用了。


2 ~1 t/ A! u* n% C: ?$ O( m% f' e8 _7 @  s7 c  G" ~% C

' T& V% N! E! E5、一些错误记录

(1)start问题

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ ./bin/elasticsearch &

[1] 20726

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]];

Likely root cause: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]

         at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:65)

         at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:45)

         at org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:46)

         at org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:1080)

         at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)

         at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)

         at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:107)

         at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100)

         at org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(BootstrapCLIParser.java:48)

         at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:226)

         at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)

Refer to the log for complete error details.


6 V, D) T  f1 r' A

[1]+  Exit 1                  ./bin/elasticsearch

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$


6 a' o4 `) m% ^" |! }) Q7 T

原因是:配置文件中的=要换成:

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ more config/elasticsearch.yml  |grep -v "#"

cluster.name: es_cluster

node.name: node0

/ o! S% Y* Y, ]/ x2 C+ c

path.data: /home/elk/data

path.logs: /home/elk/logs

network.host: 192.168.121.62

network.port: 9200

[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$


& k/ k) Q5 s9 h3 v3 f4 B- e! }5 o4 z4 w' j7 s  ?, U

(2)、Unable to fetch mapping.

Unable to fetch mapping. Do you haveindices matching the pattern?

4 q6 D6 r& L/ O" S) F

这就说明logstash没有把日志写入到elasticsearch。

解决方法:

检查logstash与elasticsearch之间的通讯是否有问题,一般问题就在这。


0 \  C$ c8 W  V8 S2 n: M2 M- K) D/ y$ H1 m# y4 G' |

(3)、log4j报错

log4j:WARN No appenders could be foundfor logger (com.demo.elk.Application).

log4j:WARN Please initialize the log4jsystem properly.

log4j:WARN Seehttp://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

解决:

(a)      jdk版本比较低,需要jdk1.7以上

(b)java类和log4j.properties没有匹配上,在测试中需要将java类和log4j.properties放在一个目录上。

您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 23:57 , Processed in 0.078352 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表