2-2-logstash基础使用实例

熊 0 阅读 日志平台


1. 标准输入和标准输出测试

root@elasticsearch01:~# /usr/share/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}' 
123
{
         "event" => {
        "original" => "123"
    },
    "@timestamp" => 2024-04-07T07:32:55.157089447Z,
          "host" => {
        "hostname" => "elasticsearch01"
    },
       "message" => "123",
      "@version" => "1"
}
​

2. 测试输入数据

root@elasticsearch01:~#  /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { file { path => "/tmp/linux.txt"}}'
hello

此时的hello信息就会输入到/tmp/linux.txt文件中

root@elasticsearch01:~# cat /tmp/linux.txt 
{"@timestamp":"2024-04-07T07:37:33.384169182Z","event":{"original":"hello"},"@version":"1","host":{"hostname":"elasticsearch01"},"message":"hello"}
​

3. 测试输出到elasticsearch

root@elasticsearch01:~# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["http://192.168.71.30:9200"] index => "linux-test-%{+YYYY.MM.dd}"}}'
hello
​

此时可以在head插件的网页和cerebro上查看创建的索引

image-20240407154618943

image-20240407154648417

然后在kibana网页上创建对应的索引视图 : Stack Management-->kibana-->数据视图中, 点击创建数据视图

image-20240407155108398
image-20240407155257653

然后就可以在discover能查看到自己创建的文件信息

image-20240407155503739

这里需要注意以前elasticsearch7 以前的页面和elasticsearch8页面不一样

需要在管理---->索引模式----->创建索引模式, 中创建需要的视图

elk-base-struct-13

4. 收集单系统日志并输出至文件

  1. 在/etc/logstash/conf.d目录下创建一个收集/var/log/messages的系统日志文件: linux.conf

    root@elasticsearch01:~# cat /etc/logstash/conf.d/linux.conf 
    input {
      file {
       path => "/var/log/messages"
       start_position => "beginning"
       stat_interval => 3 
       type => "messagelog"
      }
     
    }
     
    output {
      elasticsearch {
        hosts => ["192.168.71.31:9200"]
        index => "messages-71-29-%{+YYYY.MM.dd}"
      }
     
      #stdout {
      #codec => "rubydebug"
      #}
     
    }
  2. 测试语法是否存在问题

    root@elasticsearch01:~# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/linux.conf -t
    [INFO ] 2024-04-07 08:18:13.845 [LogStash::Runner] Reflections - Reflections took 113 ms to scan 1 urls, producing 132 keys and 468 values
    [INFO ] 2024-04-07 08:18:14.046 [LogStash::Runner] javapipeline - Pipeline `main` is configured with `pipeline.ecs_compatibility: v8` setting. All plugins in this pipeline will default to `ecs_compatibility => v8` unless explicitly configured otherwise.
    Configuration OK      #测试语法 , 显示OK , 说明没问题。
    [INFO ] 2024-04-07 08:18:14.046 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
    ​
  3. 由于/var/log/messages权限默认为640、root的属主有读写权限 , 需要将此文件的权限改为644,使文件在普通用户启动logstash 时 , 有读取的权限

    root@elasticsearch01:~# chmod 644 /var/log/messages
  4. 启动logstash服务

  5. 查看head和cerebro页面

    image-20240407164426940
    image-20240407164508089

  6. 查看elasticsearch网页上收集到的messages日志信息

    image-20240407164641835
  7. 在kibana中查看message信息

    image-20240407170724353

5. 收集多日志并输出至文件

  1. 在logstash主机上安装nginx服务 , 并启动

    [root@logstash conf.d]# yum install nginx -y
    [root@logstash conf.d]# chmod 644 /var/log/nginx/access.log
    [root@logstash conf.d]# systemctl start nginx
  2. 修改logstash配置文件

    root@elasticsearch01:~# cat /etc/logstash/conf.d/linux.conf 
    input{
      file {
       path => "/var/log/messages"
       start_position => "beginning"
       stat_interval => 3
       type => "messagelog"
      }
     
      file {
       path => "/var/log/nginx/access.log"
       start_position => "beginning"
       stat_interval => 3
       type => "nginx-log"
      }
     
    }
     
    output {
      if [type] == "messagelog" {
        elasticsearch {
        hosts => ["192.168.71.31:9200"]
        index => "message-71-29-%{+YYYY.MM.dd}"
      }}
     
      if [type] == "nginx-log" {
        elasticsearch {
        hosts => ["192.168.71.31:9200"]
        index => "nginx-log-71-29-%{+YYYY.MM.dd}"
      }}
    }
  3. 修改完以上的配置文件 , 重新启动logstash服务 : systemctl restart logstash

    测试配置文件是否正常 , 显示OK就说明提取log没问题

  4. 在kibana网页上查看此时添加的nginx-log日志收集文件 , 创建索引模式

    image-20240407171040922
  5. 在discover选项查看此时已经存在了nginx-log的日志信息

    image-20240407171200069

6. 通过logstash收集tomcat json日志

6.1 配置tomcat

  1. 解压包创建软链接

    root@nginx:~# tar -xf jdk-8u401-linux-x64.tar.gz -C /usr/local/src/
    root@nginx:~# tar -xf apache-tomcat-9.0.87.tar.gz -C /usr/local/src/
    root@nginx:~# ln -sv /usr/local/src/jdk1.8.0_401 /usr/local/src/jdk
    '/usr/local/src/jdk' -> '/usr/local/src/jdk1.8.0_401'
    root@nginx:~# ln -sv /usr/local/src/apache-tomcat-9.0.87 /usr/local/src/tomcat 
    '/usr/local/src/tomcat' -> '/usr/local/src/apache-tomcat-9.0.87'
  2. 配置JAVA环境变量

    root@nginx:~# cat /etc/profile
    export HISTTIMEFORMAT="%F %T `whoami`"
    export export LANG="en_US.utf-8"
    export JAVA_HOME=/usr/local/src/jdk
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
  3. 查看版本信息及java家目录信息

    root@nginx:~# java -version
    java version "1.8.0_401"
    Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)
    root@nginx:~# echo $JAVA_HOME
    /usr/local/src/jdk
  4. 配置tomcat服务并启动

    root@nginx:~# /usr/local/src/tomcat/bin/startup.sh 
    Using CATALINA_BASE:   /usr/local/src/tomcat
    Using CATALINA_HOME:   /usr/local/src/tomcat
    Using CATALINA_TMPDIR: /usr/local/src/tomcat/temp
    Using JRE_HOME:        /usr/local/src/jdk
    Using CLASSPATH:       /usr/local/src/tomcat/bin/bootstrap.jar:/usr/local/src/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
  5. 设置访问网站路径

    root@nginx:~# cat /usr/local/src/tomcat/conf/server.xml
    <Host name="localhost"  appBase="/data/tomcat/webapps"   unpackWARs="true" autoDeploy="true">
    root@nginx:~# mkdir /data/tomcat/webapps/myapps -pv
    mkdir: created directory '/data'
    mkdir: created directory '/data/tomcat'
    mkdir: created directory '/data/tomcat/webapps'
    mkdir: created directory '/data/tomcat/webapps/myapps'
    image-20240409163218938
  6. 修改tomcat服务的配置文件 , 收集log日志为json格式。修改配置文件/usr/local/src/tomcat/conf/server.xml。修改日志名称为: tomcat_access_log.log 匹配模式修改为指定的json格式, 指定格式中的"符合由于和tomcat本身的符号冲突, 所以指定的格式里面用&quot;代替"符号

            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="tomcat_access_log" suffix=".log" 
    		pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}" />

    访问此时的tomcat日志文件

    root@nginx:~# ll /usr/local/src/tomcat/logs/tomcat_access_log.2024-04-09.log 
    -rw-r----- 1 root root 668 Apr  9 09:07 /usr/local/src/tomcat/logs/tomcat_access_log.2024-04-09.log
    root@nginx:~# cat /usr/local/src/tomcat/logs/tomcat_access_log.2024-04-09.log
    {"clientip":"192.168.71.4","ClientUser":"-","authenticated":"-","AccessTime":"[09/Apr/2024:09:07:43 +0000]","method":"GET /myapps/ HTTP/1.1","status":"304","SendBytes":"-","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}
    {"clientip":"192.168.71.4","ClientUser":"-","authenticated":"-","AccessTime":"[09/Apr/2024:09:07:45 +0000]","method":"GET /myapps/ HTTP/1.1","status":"304","SendBytes":"-","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}

    在网上校验json格式是否正常: JSON格式校验器-JSON在线工具 (json-online.com)

    image-20240409171714610

6.2 配置logstash收集tomcat日志

  1. 安装logstash

    root@nginx:~# dpkg -i logstash-8.13.1-amd64.deb 
    Selecting previously unselected package logstash.
    (Reading database ... 74813 files and directories currently installed.)
    Preparing to unpack logstash-8.13.1-amd64.deb ...
    Unpacking logstash (1:8.13.1-1) ...
    Setting up logstash (1:8.13.1-1) ..
  2. 这里需要注意, 默认情况安装logstash软件包之后,默认的运行用户名为logstash。因此需要修改对应日志权限, 保证该用户可以访问。另外可以修改对应服务的启动用户。

    root@nginx:/usr/local/src/tomcat# systemctl cat logstash
    # /lib/systemd/system/logstash.service
    [Unit]
    Description=logstash
    
    [Service]
    Type=simple
    User=root
    Group=root
    # Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
    # Prefixing the path with '-' makes it try to load, but if the file doesn't
    # exist, it continues onward.
    EnvironmentFile=-/etc/default/logstash
    EnvironmentFile=-/etc/sysconfig/logstash
    ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
    Restart=always
    WorkingDirectory=/
    Nice=19
    LimitNOFILE=16384
    
    # When stopping, how long to wait before giving up and sending SIGKILL?
    # Keep in mind that SIGKILL on a process can cause data loss.
    TimeoutStopSec=infinity
    
    [Install]
    WantedBy=multi-user.target
    
    或者修改日志权限
    root@nginx:~# chmod  644 /var/log/syslog
    root@nginx:~# chmod 644 /usr/local/src/tomcat/logs/tomcat_access_log.2024-04-09.log 
    root@nginx:~# chmod 655 /var/local/src/tomcat/logs

  3. 配置logstash配置文件

    root@nginx:/usr/local/src/tomcat# cat /etc/logstash/conf.d/tomcat-syslog.conf 
    input {
      file {
       path => "/var/log/syslog"                                   #收集ubuntu系统日志
       start_position => "beginning"
       stat_interval => 3
       type => "syslog"
      }
     
      file {
       path => "/usr/local/src/tomcat/logs/tomcat_access_log.*.log"    # 收集tomcat日志的文件目录
       start_position => "beginning"
       stat_interval => 3
       type => "tomcat-access-log"
       codec => "json"                                            # 输出tomcat 的json日志格式
      }
    }
     
    output {
      if [type] == "syslog" {
       elasticsearch {
       hosts => ["192.168.71.29:9200"]
       index => "syslog-71-37-%{+YYYY.MM.dd}"
       }
      }
     
      if [type] == "tomcat-access-log" {
       elasticsearch {
       hosts => ["192.168.71.29:9200"]
       index => "tomcat-access-log-71-37-%{+YYYY.MM.dd}"
       }
      }
    }

6.3 配置kinbana视图

  1. 在head插件或者cerebro页面中查看是否添加了新的index

    image-20240409195416822
    image-20240409195528466
  2. 创建对应日志的数据视图

    image-20240409181737285
    image-20240409200304112
  3. 在discovery中查看这两个日志视图

    syslog日志视图

    image-20240409200825322

    tomcat json视图

    image-20240409201613054
    image-20240409201713883

7. java多行错误日志收集

部分服务的报错日志都会按照多行输出的方式显示。这里以java举例:

image-20240409212244819

这里可以看到java一次报错日志出现多行信息.这里查看的是elasticsearch的集群日志信息。这里通过停掉elasticsearch集群中的一个节点生成的日志信息

logstash配置文件如下, 这里为了配置方便直接将对应日志文件拷贝到tmp目录下面进行配置

root@logstash01:~# cat /etc/logstash/conf.d/es-error.conf 
input {
  file {
   path => "/tmp/elasticsearch-cluster.log"  
   start_position => "beginning"
      codec => multiline {
             pattern => "^\["      # 以[开头开始匹配, 按照正则表达式匹配
             negate => true        #可选值( false , true) 。true表示不匹配模式的内容将成为匹配项 , 被what应用 , 即取反。false为默认值。
             what => "previous"    #必须的设置 , 可选值( previous , next) 。如果模式匹配 , 则事件是属于下一个事件还是上一个事件 , 即指定将匹配到的行与前面的行合并还是和后面的行合并    
      }
   }
}

#这里简单说明以下, 假设行A与pattern不匹配,由于negate为true, 则该行会被应用到what里面。到what之后又由于为previous, 则把该A行与之前的行设置为同一个事件。直到后面行与pattern匹配之后, 便输出A行所在事件 
 
output {  
    elasticsearch {
    hosts => ["192.168.71.31:9200"]
    index => "es-%{+YYYY.MM.dd}"
  }
}

重启之后可以在head插件中看到对应index

image-20240409214156500

image-20240409214225478

创建对应视图

image-20240409214322533

点击查看message字段

image-20240409215343313

点击进入全屏

image-20240409215447356

将单元格行高调整为自适应之后可以看到, java报错的多行信息均记录下来了

image-20240409215248866

image-20240409215616915

8. nginx访问日志和错误日志收集

8.1 nginx配置

这里的nginx日志收集主要是希望按照json格式的日志收集。因此需要单独配置nginx的日志格式

  1. 安装nginx , 生产中最好是源码编译nginx服务。

    root@nginx:~# apt install nginx
  2. 配置nginx的日志格式。修改nginx.conf配置文件

    http {
        log_format access_json '{"@timestamp":"$time_iso8601",'  # 在http段改为json格式
            '"host":"$server_addr",'
            '"clientip":"$remote_addr",'
            '"size":$body_bytes_sent,'
            '"responsetime":$request_time,'
            '"upstreamtime":"$upstream_response_time",'
            '"upstreamhost":"$upstream_addr",'
            '"http_host":"$host",'
            '"url":"$uri",'
            '"domain":"$host",'
            '"xff":"$http_x_forwarded_for",'
            '"referer":"$http_referer",'
            '"status":"$status"}';
     
        access_log  /var/log/nginx/access.log  access_json;  #末尾和起始的名称一致
        #access_log /var/log/nginx/access.log;               #注释掉原本的日志信息
       
  3. 验证nginx配置文件是否正常, 并且启动nginx服务

    root@nginx:~# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    root@nginx:~# systemctl start nginx

8.2 配置Logstash

  1. 在logstash主机的/etc/logstash/conf.d/目录下创建一个nginx.conf配置文件

    input {
      file {
       path => "/var/log/nginx/access.log"  # 从nginx的日志目录下提取日志文件
       start_position => "beginning"
       stat_interval => 3
       type => "nginx-access-log"  # log日志名称
       codec => "json"  # 标准输入是指定为json格式
      }
     
    }
     
    output {
      if [type] == "nginx-access-log" {
        elasticsearch {   # 标准输出至elasticsearch主机上
        hosts => ["192.168.71.29:9200"]
        index => "nginx-access-log-71-29-%{+YYYY.MM.dd}"
      }}
    }
  2. 重新启动logstash服务

    root@nginx:~# systemctl restart logstash
  3. 可以看到对应elasticsearch 中有对应index

    image-20240409221952022

8.3 配置kinbana

  1. 创建对应视图

    image-20240409222136538
  2. 可以看到已经识别到对应的json字段

    image-20240409222744499
    image-20240409222835765

9. TCP日志收集

通过logstash的tcp/udp插件收集日志 , 通常用于在向elasticsearch日志补录丢失的部分日志 , 可以将丢失的日志写到一个文件 , 然后通过TCP日志收集方式直接发送给logstash然后再写入到elasticsearch服务器。

参数

默认值

说明

port

必填

当模式为server时 , 指定侦听的端口。 当模式为client时 , 指定连接对端的端口。

host

“0.0.0.0”

当模式为server时 , 指定本地侦听的地址。 当模式为client时 , 指定对端连接的地址。

mode

server

操作模式, 有两个值server/client。 server : 侦听客户端连接 client : 连接到服务器。

add_field

在对应事件中添加字段

codec

用于输入数据的编解码器。

type

将type字段添加到此输入处理的所有事件中。如果您试图为已经有type的事件设置类型(例如 , 当您将事件从发件人发送到index时) , 则新输入将不会覆盖现有类型。即使发送到另一个Logstash服务器 , 在发件人处设置的类型也会在该事件的整个生命周期中保持不变。

9.1 配置logstash

  1. 配置文件如下

    root@logstash01:~# cat /etc/logstash/conf.d/tcp.conf 
    input { 
      tcp { 
        port => 9889 
        type => "tcplog" 
        mode => "server"   
        codec => "json"
      } 
    } 
    output { 
      stdout { 
      codec => rubydebug 
      } 
    } 
  2. 运行命令临时测试

    root@logstash01:~# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tcp.conf  -t

9.2 使用nc测试

  1. 使用nc命令

    NetCat简称nc , 在网络工具中有“瑞士军刀”美誉 , 其功能实用 , 是一个简单、 可靠的网络工具 , 可通过TCP或UDP协议传输读写数据 , 另外还具有很多其他 功能。

    root@ubuntu2204:~# echo "nc test" | nc 192.168.71.32 9889
  2. 在Logstash节点查看。验证 logstash 是否接收到数据

    image-20240410004409968
  3. 通过nc命令发送一个文件

    root@ubuntu2204:~# nc 192.168.71.32 9889 < /etc/passwd
  4. 验证Logstash中接受的批量数据

    image-20240410005226586

9.3 通过伪设备发送信息

在类Unix操作系统中 , 块设备有硬盘、内存的硬件 , 但是还有设备节点并不 一定要对应物理设备 , 我们把没有这种对应关系的设备是伪设备 , 比如/dev/null , /dev/zero , /dev/random以及/dev/tcp和/dev/udp等 , Linux操作系统使用这些伪 设备提供了多种不通的功能 , tcp通信只是dev下面众多伪设备当中的一种设备。

root@ubuntu2204:~# echo "伪设备" > /dev/tcp/192.168.71.32/9889

logstash中查看对应输入信息

image-20240410005758745

9.4 将logstsh输出改为elasticsearch

整体配置文件如下:

root@logstash01:~# cat /etc/logstash/conf.d/tcp.conf 
input {  
  tcp { 
    port => 9889 
    type => "tcplog" 
    mode => "server"   
    codec => "json"
  } 
} 
output { 
  #stdout { 
  #codec => rubydebug 
  #}
  elasticsearch {
    hosts => ["192.168.71.29:9200"]
    index => "tcp-%{+YYYY.MM.dd}"
  } 
} 

客户端通过命令传入部分数据

root@ubuntu2204:~# echo "伪设备" > /dev/tcp/192.168.71.32/9889
root@ubuntu2204:~# echo "伪设备1" > /dev/tcp/192.168.71.32/9889
root@ubuntu2204:~# echo "伪设备2" > /dev/tcp/192.168.71.32/9889
root@ubuntu2204:~# echo "伪设备3" > /dev/tcp/192.168.71.32/9889

在kibana中创建对应视图,并检查对应传入数据的信息

image-20240410012412231

10. 通过rsyslog 和logstash 收集haproxy日志

rsyslog提供高性能 , 高安全性功能和模块化设计。 虽然它最初是作为常规系 统日志开发的 , 但是 rsyslog 已经发展成为一种瑞士军刀 , 可以接受来自各种来源的输入 , 转换它们 , 并将结果输出到不同的目的地。 当应用有限的处理时 , RSYSLOG 每秒可以向本地目的地传送超过一百万条消息。

即使有远程目的地和更复杂的处理 , 性能通常被认为是“惊人的”。 在centos 6及之前的版本叫做syslog , centos 7开始叫做rsyslog , 根据官方的 介绍 , rsyslog(2013年版本)可以达到每秒转发百万条日志的级别 , 官方网址 : http://www.rsyslog.com/ , 确认系统安装的版本命令如下 :

root@nginx:/var/log/nginx# apt list --installed rsyslog
Listing... Done
rsyslog/jammy-security,jammy-updates,now 8.2112.0-2ubuntu2.2 amd64 [installed,automatic]
N: There is 1 additional version. Please use the '-a' switch to see it


[root@haproxy ~]# yum list rsyslog
Last metadata expiration check: 0:06:41 ago on Wed 10 Apr 2024 11:07:57 AM CST.
Installed Packages
rsyslog.x86_64                                                    8.2102.0-5.el8                                                    @AppStream

10.1 配置haproxy

  1. 安装haproxy

    [root@haproxy ~]# yum install haproxy
  2. 修改haproxy配置文件

    [root@haproxy ~]# cat /etc/haproxy/haproxy.cfg
    #---------------------------------------------------------------------
    # Example configuration for a possible web application.  See the
    # full configuration options online.
    #
    #   https://www.haproxy.org/download/1.8/doc/configuration.txt
    #
    #---------------------------------------------------------------------
    
    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    global
        # to have these messages end up in /var/log/haproxy.log you will
        # need to:
        #
        # 1) configure syslog to accept network log events.  This is done
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
        #    /etc/sysconfig/syslog
        #
        # 2) configure local2 events to go to the /var/log/haproxy.log
        #   file. A line like the following can be added to
        #   /etc/sysconfig/syslog
        #
        #    local2.*                       /var/log/haproxy.log
        #
        log         127.0.0.1 local2       #定义haproxy的日志级别 , 默认就是local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
        # utilize system-wide crypto-policies
        ssl-default-bind-ciphers PROFILE=SYSTEM
        ssl-default-server-ciphers PROFILE=SYSTEM
    
    listen stats
        bind *:8080
        mode http
        stats enable
        stats uri /haproxy
        stats refresh 5s
        stats realm haproxy-status
        stats auth admin:123456
    
    listen elasticsearch         #监听elasticsearch端口
       bind 0.0.0.0:9200
       mode tcp
       log global                # 调用haproxy全局部分的log文件
       server 192.168.71.29 192.168.71.29:9200 check inter 2000 rise 3 fall 2 
       server 192.168.71.30 192.168.71.30:9200 check
       server 192.168.71.31 192.168.71.31:9200 check

10.2 配置syslog服务

  1. 修改rsyslog配置文件 , 并定义log日志级别。开启对应udp端口

    [root@haproxy ~]# cat /etc/rsyslog.conf
    
    #开启rsyslog服务的udp端口
    module(load="imudp")
    input(type="imudp" port="514")
    
    #开启rsyslog的tcp端口
    module(load="imtcp")
    input(type="imtcp" port="514")
    
    
    
    
    local2.*                 /var/log/haproxy              # 对应haproxy的日志级别
    local2.*                @@192.168.71.32:1514           #指定logstash主机的IP地址和对应的logstash配置文件中的端口号 : 1514 , 两个@@属于tcp网络模式
    
    
    
  2. 重启rsyslog服务

    [root@haproxy ~]# systemctl restart rsyslog
    image-20240410130106914

10.3 配置logstash服务

  1. 配置logstash服务

    input {
       syslog {
          port => 1514  #与rsyslog配置文件中监控的端口号一致
          type => "rsyslog-100"
      }
    }
     
     
    output {
      if [type] == "rsyslog-100" {
      elasticsearch {
         hosts => ["192.168.71.36:9200"]                   #这里指定haproxy的前端监听IP , 正常生产环境也推荐访问haproxy的高可用IP,这样可以保证后端的高可用
         index => "rsyslog-71-36-%{+YYYY.MM.dd}"
      }
     }
    }
  2. 配置完成之后检查head插件页面 , 查看index是否生成

    image-20240410141133759
    image-20240410141228581

10.4 配置kinbana页面

  1. 创建对应视图

    image-20240410141502895
  2. 检查收集的日志信息

    image-20240410141603436

11. 通过grok 调整日志信息

由于收集的服务日志信息里面可能包含时间、用户名或者其他各种信息。这里以ubuntu系统的系统日志文件(syslog)为例

Apr  5 05:34:27 ubuntu2204 systemd[1]: Starting Flush Journal to Persistent Storage...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Starting Create Static Device Nodes in /dev...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Finished Flush Journal to Persistent Storage.
Apr  5 05:34:27 ubuntu2204 systemd[1]: Finished Create Static Device Nodes in /dev.
Apr  5 05:34:27 ubuntu2204 systemd[1]: Starting Rule-based Manager for Device Events and Files...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Finished Coldplug All udev Devices.
Apr  5 05:34:27 ubuntu2204 multipathd[392]: --------start up--------
Apr  5 05:34:27 ubuntu2204 multipathd[392]: read /etc/multipath.conf
Apr  5 05:34:27 ubuntu2204 multipathd[392]: path checkers start up
Apr  5 05:34:27 ubuntu2204 systemd[1]: Started Device-Mapper Multipath Device Controller.
Apr  5 05:34:27 ubuntu2204 systemd[1]: Reached target Preparation for Local File Systems.
Apr  5 05:34:27 ubuntu2204 systemd[1]: Mounting Mount unit for core20, revision 2105...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Mounting Mount unit for lxd, revision 27037...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Mounting Mount unit for snapd, revision 20671...
Apr  5 05:34:27 ubuntu2204 systemd[1]: Mounted Mount unit for core20, revision 2105.

上面信息为部分日志信息。默认logstash收集日志时, 会直接将日志中的每一行都单独分配到index的message字段中, 不会再有具体的信息分类了。除非像nginx或者tomcat调整为json格式

这里展示一个logstash配置文件内容。这个文件内容主要是filter里面的grok、date插件。grok主要是使用内置的表达式变量: SYSLOGBASE ,主要是为了拆分syslog的时间 主机名 , 服务名和PID , 这四个值。之后通过overwrite重写message字段信息, 把具体的服务运行过程中的信息单独提交给message字段。通过date, 将grok中通过SYSLOGBASE生成的timestamp字段转义为时间, 同时将该字段的值分配给@timestamp, 这个分配过程是由date插件中的target参数实现的, 这个参数默认就是将转义的时间分配给@timestamp

root@nginx:/var/lib/logstash/plugins/inputs/file# cat /etc/logstash/conf.d/tomcat-syslog.conf 
input {
  file {
   path => "/var/log/syslog" 
   start_position => "beginning"
   stat_interval => 3
   type => "syslog"
  }
 
  file {
   path => "/usr/local/src/tomcat/logs/tomcat_access_log.*.log"  
   start_position => "beginning"
   stat_interval => 3
   type => "tomcat-access-log"
   codec => "json" 
  }
}
filter {
    
    grok {
        match => {
            "message" => "%{SYSLOGBASE} %{GREEDYDATA:message}"
        }
        overwrite => ["message"]
    }
    date {
        match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss", "ISO8601" ]
    }
}
 
output {
  if [type] == "syslog" {
   elasticsearch {
     hosts => ["192.168.71.29:9200"]
     index => "syslog-71-37-%{+YYYY.MM.dd}"
   }
   #stdout{codec=>rubydebug}
  }
 
  if [type] == "tomcat-access-log" {
   elasticsearch {
   hosts => ["192.168.71.29:9200"]
   index => "tomcat-access-log-71-37-%{+YYYY.MM.dd}"
   }
  }
}

之后通过kinbana页面查配置之后的日志信息

image-20240411023629321

12. 基于logstash测试kafka和zookeeper

  1. 在logstash服务器的/etc/logstash/conf.d目录下创建一个测试kafka的标准输出、标准输入文件

    input {
        stdin {}
    }
    output {
        kafka {
            topic_id => "hello"
            bootstrap_servers => "192.168.7.104:9092"  # IP地址为kafka的地址以及监听的端口号 , 测试其他集群的kafka主机 , 需要修改IP地址即可。
            batch_size => 5      #每当多个记录被发送到同一个分区时 , 生产者将尝试将记录批处理成更少的请求。这有助于提高客户端和服务器的性能。此配置控制以字节为单位的默认批处理大小。
        }
        stdout {
            codec => rubydebug
        }
    }
  2. 开始测是kafka的日志文件是否可以传到logstash服务器上

    [root@logstash conf.d]# logstash -f log-to-kafka.conf  # 测试配置文件
    {
              "host" => "logstash",
           "message" => "hello world", # 输入的hello world已经可以在logstash显示
          "@version" => "1",
        "@timestamp" => 2020-03-15T03:30:03.426Z
    }
    nihao
    {
              "host" => "logstash",
           "message" => "nihao",  # 输入的nihao也已经可以在logstash服务上显示
          "@version" => "1",
        "@timestamp" => 2020-03-15T03:30:12.118Z
    }

13. logstash结合kafka收集系统日志和nginx日志

logstash事件output到kafka默认的codec为json , 如果设置codec为plain , 因为除了message数据之外还会有一个主机名和时间戳的字段生成 , 如果只需要message字段 , 配置如下:

output {
    kafka {
       codec => plain {
            format => "%{message}"
        }
    }
}
#示例一
input {
      kafka {
        client_id => "logstash-1-1"
        type => "accesslogs"
        codec => "plain"
        auto_offset_reset => "earliest"
        group_id => "elas1"
        topics  => "accesslogs"  -- 旧版本的logstash需要使用参数:topic_id
        bootstrap_servers => "JANSON01:9092,JANSON02:9092,JANSON03:9092" -- 旧版本的logstash需要使用参数:zk_connect=>"JANSON01:2181,xx"
      }

      kafka {
        client_id => "logstash-1-2"
        type => "gamelogs"
        auto_offset_reset => "earliest"
        codec => "plain"
        group_id => "elas2"
        topics => "gamelogs"
        bootstrap_servers => "JANSON01:9092,JANSON02:9092,JANSON03:9092"
      }
}

auto_offset_reset
    earliest 
    当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 
    latest 
    当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 
    none 
    topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常

示例二
input {
   kafka {
      topics => "filebeat-systemlog-7-103" # 与filebeat的配置文件对应
      bootstrap_servers => "192.168.7.105:9092" # 与filebeat集群主机的leader主机IP地址对应
      codec => "json"
      consumer_threads => 1 #理想情况下,您应该拥有与分区数量一样多的线程,以实现完美的平衡 — 线程多于分区意味着一些线程将处于空闲状态
      
   }}
 
output {
  if [fields][app] == "syslog" {  # app类型要与filebeat主机的app对用。
    elasticsearch {
      hosts => ["192.168.7.100:9200"] # 转发到elasticsearch服务器上
      index => "filebeat-syslog-7-103-%{+YYYY.MM.dd}"
    }}
}

1769223-20200315184410161-1169149054

A主机:kibana、elasticsearch , 有条件可以将两个服务器分开:192.168.7.100

B主机:logstash主机:192.168.7.101/nginx服务器也在此主机上

C主机:logstash主机:192.168.7.102

D主机:kafka/zookeeper:192.168.7.104

E主机:kafka/zookeeper:192.168.7.105

13.1 使用logstash-B主机收集系统日志和nginx日志写入kafka

  1. 我们在搭建完kafka及zookeeper的基础上 , 选择提取zookeeper的leader的主机进行存储

    [root@tomcat-web2 ~]# /usr/local/zookeeper/bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Mode: leader  # 查看到192.168.7.105主机是leader模式
  2. 在logstash主机/etc/logstash/conf.d/目录下创建收集系统日志和nginx日志的文件

    [root@logstash-1 conf.d]# cat log-to-kafka.conf
    input {
      file {
        path => "/var/log/messages"
        type => "kafka-syslog-log-7-101" # 定义系统日志类型
        start_position => "beginning"
        stat_interval => "2"
      }
     
      file {
        path => "/var/log/nginx/access.log"
        type => "kafka-nginx-access-log-7-101" # 定义nginx的日志类型
        start_position => "beginning"
        stat_interval => "2"
        codec => "json"  # 如果是json格式的日志 , 必须写入json格式
      }
    }
     
    output {
     if [type] == "kafka-syslog-log-7-101" {
        kafka {
          topic_id => "kafka-syslog-log-7-101"
          bootstrap_servers => "192.168.7.105:9092"  # 指定写入到kafka的leader主机的IP地址上
          codec => "json" # 写入的时候使用json编码 , 因为logstash收集后会转换为json格式
        }
      file {
        path => "/tmp/syslog.log" # 将收集到的访问系统的日志临时存在此文件下 , 方便排错 , 解决问题后 , 可以删除此两项
       }}
     
     
     if [type] == "kafka-nginx-access-log-7-101" {
        kafka {
          topic_id => "kafka-nginx-access-log-7-101"
          bootstrap_servers => "192.168.7.105:9092" # 指定写入到kafka主机的IP地址
          codec => "json" # 写入的时候使用json编码 , 因为Logstash收集后会转换为json格式
        }
     file {
        path => "/tmp/nginx-access.log" # 临时先存放在此文件下 , 方便排错 , 如果没有错误 , 可以删除此项
       }}
    }
  3. 验证logstash配置文件的正确性

    [root@logstash-1 conf.d]``# logstash -f log-to-kafka.conf
    1769223-20200315161013592-640622440
  4. 开始访问nginx网页 , (192.168.7.101:80)再查看访问的临时log信息

    1769223-20200315161215414-1997861762
  5. 在logstash主机上测试系统日志访问情况

    [root@logstash-1 ~]# echo 1 >> /var/log/messages
    [root@logstash-1 ~]# echo 2 >> /var/log/messages
    [root@logstash-1 ~]# echo 3 >> /var/log/messages 
  6. 查看此时的临时文件信息

    1769223-20200315162012693-234537253

    此时测试logstash收集到日志写入到kafka中正常,可以将测试的file部分脚本删除掉,然后启动logstash服务。

    file {
       path => "/tmp/syslog.log" # 删除掉两个测试部分
      }
     
    file {
       path => "/tmp/nginx-access.log"
      }

    启动D主机的logstash服务。

    # systemctl start logstash

13.2 配置logstash-C主机从kafka读取系统日志和nginx日志

  1. 在logstash-A主机的/etc/logstash/conf.d/目录下创建一个收集kafka配置文件

    [root@logstash conf.d]# vim kafka-to-es_logstash.conf
    input {
       kafka {
          topics => "kafka-syslog-log-7-101"
          bootstrap_servers => "192.168.7.105:9092"  # 从kafka的leader主机上提取缓存
          codec => "json"  # 在提取kafka主机的日志时,需要写成json格式
       }
    } 
     
     
    output {
      if [type] == "kafka-syslog-log-7-101" {  # 转到elasticsearch主机上
       elasticsearch {
          hosts => ["192.168.7.100:9200"]
          index => "kafka-syslog-7-101-%{+YYYY.ww}" # YYYY代表年,ww代表周
        }}
     
      if [type] == "kafka-nginx-access-log-7-101" {  # 转到elasticsearch主机上
       elasticsearch {
          hosts => ["192.168.7.100:9200"]
          index => "kafka-nginx-access-log-7-101-%{+YYYY.MM.dd}"
        }}
    }
  2. 启动logstash-B主机的服务器

    # systemctl start logstash