ELK部署文档--logstash

1 背景

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。

这是一个最简单的架构图:

filebeat ==> logstash ==> elasticsearch ==> kibana

  • 资源准备

    下载部署包地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

    注:elk全家桶各个应用版本需一致

  • java版本

    java版本要求jdk1.8+,查看版本:
    java -version

  • 创建用户

    elk需要用非root用户部署,因此需要创建一个账号用于部署
    useradd elk

    修改目录的权限,给elk赋权
    chown elk:elk /data/software/elk -R

2 logstash

logstash是一个开源的数据处理工具,可以同时从多个数据源收集数据,并对其进行特定格式转换,再输出到elasticsearch或其它数据储存工具

logstash默认端口为9600

image-20211220165925648

2.1 下载安装

  • 解压安装包到指定目录/data/software/elk
    tar -vxf logstash-7.15.2-linux-x86_64.tar.gz -C /data/software/elk

2.2 配置文件

  • 在config目录下创建配置文件
    vim itcast-pipeline.conf
input {
    beats {
        port => 5044 # 输入端口号
    }
}

filter {
  grok { # 可配置多个grok,按照顺序进行匹配
        match =>{
          "message" => "%{MONTH:MONTH} %{MONTHDAY:MONTHDAY} %{TIME:TIME} %{MONTH:MONTH_log} %{MONTHDAY:MONTHDAY_log} %{YEAR:YEAR_log} %{TIME:TIME_log}%{ISO8601_TIMEZONE:ISO8601_TIMEZONE} %{WORD:system_name} %%%{INT:sys_version}%{EMAILLOCALPART:module}/%{INT:log_level}/%{NOTSPACE:summary_1}:\s*(?<summary_2>([\d|\w|\s]*)). \(Task=%{WORD:task}, Ip=%{NOTSPACE:Ip}, VpnName=%{NOTSPACE:VpnName}, User=%{NOTSPACE:User}, AuthenticationMethod=%{QUOTEDSTRING:AuthenticationMethod}, Command=%{QUOTEDSTRING:Command}"
          }

        match =>{
          "message" => "%{MONTH:MONTH} %{MONTHDAY:MONTHDAY} %{TIME:TIME} %{MONTH:MONTH_log} %{MONTHDAY:MONTHDAY_log} %{YEAR:YEAR_log} %{TIME:TIME_log}%{ISO8601_TIMEZONE:ISO8601_TIMEZONE} %{WORD:system_name} %%%{INT:sys_version}%{EMAILLOCALPART:module}/%{INT:log_level}/%{NOTSPACE:summary_1}:\s*(?<summary_2>([\d|\w|\s]*)). \(Task=%{WORD:task}, Ip=%{NOTSPACE:Ip}, VpnName=, User=%{NOTSPACE:User}, AuthenticationMethod=%{QUOTEDSTRING:AuthenticationMethod}, Command=%{QUOTEDSTRING:Command}"
          }

        match =>{
          "message" => "%{MONTH:MONTH} %{MONTHDAY:MONTHDAY} %{TIME:TIME} %{MONTH:MONTH_log} %{MONTHDAY:MONTHDAY_log} %{YEAR:YEAR_log} %{TIME:TIME_log}%{ISO8601_TIMEZONE:ISO8601_TIMEZONE} %{WORD:system_name} %%%{INT:sys_version}%{EMAILLOCALPART:module}/%{INT:log_level}/%{NOTSPACE:summary_1}:\s*(?<summary_2>([\d|\w|\s]*))."
          }
    }
}

output {
        elasticsearch {
                hosts => ["http://176.16.9.3:9200"]
                index => "xc-syslog-%{+YYYY-MM-dd}"
                user => "elastic"
                password => "ap20pOPS20"
    }
}

# output { # 调试时可输出到终端方便查看处理后数据
#     stdout { codec => rubydebug }
#     }

2.3 grok

来自不同数据源的数据,在logstash中读取都是一行一行的文本数据,输出的时候它们都是作为一行放到输出的message字段中,因此需要对message进行切割放入不同的字段中,以便后续进行分析。在logstash中可以使用grok对数据进行处理

  • 预设匹配规则

    • grok的语法格式

      %{SYNTAX:SEMANTIC}
      # SYNTAX是数据生成的字段名称,SEMANTIC是匹配出内容的规则(用正则表达式匹配出数据)
      

      logstash中数据提取需要使用正则表达式匹配,官方已预设一些匹配规则,详细定义参见github 中的说明,以下为常用规则:

    表达式 名称 例子
    USERNAME 用户名(由数字、大小写及特殊字符(._-)组成的字符串) 1234、Bob、Alex.Wong
    EMAILLOCALPART 用户名(首位由大小写字母组成,其他位由数字、大小写及特殊字符(_.+-=:)组成的字符串) windcoder、windcoder_com
    EMAILADDRESS 电子邮箱地址 windcoder@abc.com
    INT 整数(包括0和正负整数) 0、-123
    NUMBER 整数或者小数
    WORD 字符串(包括数字和大小写字母) String、3529345
    NOTSPACE 不带任何空格的字符串
    SPACE 空格字符串
    QUOTEDSTRING 带引号的字符串 "This is an apple"
    IP IP地址(IPv4或IPv6地址) 127.0.0.1
    HOSTPORT 主机名(IP)+端口 127.0.0.1:3306
    PATH 路径
    URIPROTO URI协议 http、ftp
    URI 完整的URI
    MONTH 月份名称(英文) Jan、January
    MONTHNUM 月份数字 03、9、12
    MONTHDAY 日期数字 03、9、31
    DAY 星期几名称 Mon、Monday
    YEAR 年份数字 1986
    HOUR 小时数字
    MINUTE 分钟数字
    SECOND 秒数字
    TIME 时间 00:01:23
    DATE_US 美国时间 10-01-1892、10/01/1892/
    DATE_EU 欧洲日期格式 01-10-1892、01/10/1882、01.10.1892
    ISO8601_TIMEZONE ISO8601时间格式 +10:23、-1023
    TIMESTAMP_ISO8601 ISO8601时间戳格式 2016-07-03T00:34:06+08:00
    DATESTAMP 完整日期+时间 07-03-2016 00:34:06
    HTTPDATE http默认日期格式 03/Jul/2016:00:36:53 +0800
    GREEDYDATA 匹配所有剩余的数据
    • 示例

    日志信息为:

    Dec 21 02:31:10+08:00 MM_104_F15_XC_MGMT_CE5735_4
    

    匹配规则为:

    "%{MONTH:MONTH} %{MONTHDAY:MONTHDAY} %{TIME:TIME}{ISO8601_TIMEZONE:ISO8601_TIMEZONE} %{WORD:system_name}"
    
  • 自定义正则表达式

    除了可以用上述的预设匹配规则之外,还可以自定义正则表达式

    • 语法格式

      (?<class_info>([\S+]*))
      # <class_info>数据生成的字段名称,[]里面为自定义正则表达式
      
      
    • 示例

      日志信息为:

      %%01SHELL/5/CMDRECORD(s)[703]:Recorded command information. (Task=VT0, Ip=192.168.144.161, VpnName=, User=huaweiqyw3, AuthenticationMethod="Local-user", Command="system-view")
      

      匹配规则为:

      "%%%{INT:sys_version}%{EMAILLOCALPART:module}/%{INT:log_level}/%{NOTSPACE:summary_1}:\s*(?<summary_2>([\d|\w|\s]*)). \(Task=%{WORD:task}, Ip=%{NOTSPACE:Ip}, VpnName=%{NOTSPACE:VpnName}, User=%{NOTSPACE:User}, AuthenticationMethod=%{QUOTEDSTRING:AuthenticationMethod}, Command=%{QUOTEDSTRING:Command}"
      

2.4 服务部署启用

在logstash目录下启用:
./bin/logstash -f ./config/itcast-pipeline.conf -l ./logstash.log --config.reload.automatic

-f 为指定配置文件
-l为指定输出日志路径
--config.reload.automatic为启用自动配置加载,每次修改完配置文件以后无需重启Logstash

检查服务:
ps -ef | grep logstash

2.5 报错处理

2.5.1. Java路径

报错信息为:could not find java; set JAVA_HOME or ensure java is in PATH

解决方案:在bin目录下logstash.lib.sh文件里面添加 JAVACMD='java的启用路径'

保存后重新启动

posted @ 2021-12-21 15:45  liu_kx  阅读(748)  评论(0编辑  收藏  举报