ELK日志

一,Elastic Stack 在企业的常用架构

1,没有日志收集系统运维工作的日常"痛点"概述

如上图所示,简单画了一下互联网常用的一些技术栈相关架构图,请问如果让你对上图中的各组件日志进行收集,分析,存储,展示该如何做呢?
你是否也会经常面临以下的运维痛点呢?
生产出现故障后,运维需要不停的查看各种不同的日志进行分析?是不是毫无头绪?
项目上线出现错误,如何快速定位问题?如果后端节点过多,日志分散怎么办?
开发人员需要实时查看日志但又不想给服务器的登陆权限,怎么办?难道每天帮开发取日志?
如何在海量的日志中快速的提取我们想要的数据?比如:pv,uv,TOP10的URL?如果分析的日志数据量大,那么势必会导致查询速度慢。难度增大,最终则会导致我们无法快速的获取到想要的指标。
CDN公司需要不停的分析日志,那分析什么?主要分析命中率,为什么?因为我们给用户承诺的命中率90%以上,如果没有达到90%,我们就要去分析数据为什么没有被命中,为什么没有被缓存下来。
近期某影视公司周五下午频繁出现被盗链的情况,导致异常流量突增2G有余。给公司带来了损失,那又该如何分析异常流量呢?
上百台Mysql实例的日志查询分析如何聚集?
docker,k8s平台日志如何收集分析?。。。
如上所有的痛点都可以使用日志分析系统"Elastic Stack"解决,将运维所有的服务器日志,业务系统日志都收集到一个平台下,然后提取想要的内容,比如错误信息,警告信息等,出过滤到这种消息,就马上告警。告警后,运维人员就能马上定位是哪台机器,哪个业务系统出了问题,出现了什么问题。

2,Elastic Stack 分布式日志系统概述

ELK(Elasticsearch logstash kibana)
Elasticsearch 解决数据存储和检索(查询) 专门做数据存储的
Logtash 做日志转换,日志收集,处理,将一些字段该删的删,该切割的切割,他能做一些简单的处理,他提供了丰富的插件。 专门做数据收集的
Kibana 是一个图形化的管理插件,他可以展示数据。 专门做数据展示的。
Beats 就一个收集日志的作用 有了Beats就实现了收集和处理日志的解耦
The Good Old 代表 ELK
The Brand New 代表 ElasticStack(弹性堆栈)
The Elastic Stack 包括 Elasticsearch ,Kibana,Beats,和 Logstash(也称为 ELK Stack).
Elasticsearch:
简称为 ES ,ES是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack技术栈的核心。
它可以近乎实时的存储,检索数据,本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

Kibana:

是一个免费且开放的用户界面,能够让你对 Elasticsearch 数据进行可视化,并让你在 ElasticStack中进行导航。你可以进行各种操作,从跟踪查询负载,到理解请求如何流经你的整个应用,都能轻松完成。

Beats:

是一个免费且开放的平台,集合了多种单一用途数据采集器。他们从成百上千万台机器和系统向 Logstash或 Elasticsearch发送数据。

Logstash:

是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到你最喜欢的 "存储库"中。

Elastic Stack 的主要优点有如下几个:

(1) 处理方式灵活:
elasticsearch 是实时全文索引,具有强大的搜索功能。
(2) 配置相对简单:
elasticsearch 全部使用 JSON 接口,logstash使用模块配置,kibana配置文件部分更简单
(3) 检索性能高效:
基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应
(4) 集群线性扩展:
elasticsearch 和 logstash 都可以灵活线性扩展。
(5) 前端操作绚丽:
kibana的前端设计比较绚丽,而且操作简单。
使用 elastic stack 能收集哪些日志:
容器管理工具: docker
容器编排工具:docker swarm,Kubernetes
负载均衡服务器:lvs,haproxy,nginx
web 服务器:httpd,nginx,tomcat
数据库:mysql,redis,NongoDB,Hbase,Kudu,ClickHouse,PostgreSQL
存储:nfs,gluterfs,fastdfs,HDFS,Ceph
系统:message,security
业务:包括但不限于C,C++,Java,PHP,Go,Python.Shell等编程语言研发的App

3,Elastic Stack 企业级 "EFK" 架构图

数据流走向:源数据层(nginx,tomcat)-->数据采集层(filebeat)-->数据存储层(Elasticsearch).
4,Elastic Stack 企业级 "ELK" 架构图
数据流走向:源数据层(nginx,tomcat)-->数据采集/转换层(Logstash)-->数据存储层(Elasticsearch).
5,Elastic Stack 企业级 "ELFK"架构图解

数据流走向:源数据层(nginx,tomcat)-->数据采集(filebeat)-->转换层(Logstash)-->数据存储层(Elasticsearch).

6,Elastic Stack 企业级 "ELFK"+"kafka" 架构图解
数据流走向:源数据层(nginx,tomcat)-->数据采集(filebeat)-->数据缓存层(kafka)-->转换层(Logstash)-->数据存储层(ElasticSearch).
7,Elastic Stack 企业级 "ELFK"+"kafka" 架构演变
如上图所示,在实际工作中,如果有大数据部门的存在。也有可能kafka的数据要被多个公司使用的。
8,课程学习方法介绍
(1) 学而时习之,上课不能光听不练习,听懂不等于会了;
(2)将学习的内容用自己的话说出来,毕竟将来找工作的时候需要面试官面对面的交流;
(3) 多动手,画架构图,勤做笔记,好记性不如烂笔头;
(4) 课堂上讲解的内容,遇到问题可以尝试自己先行排查,但超过30分钟以上还搞不定,就得问老师或同学;
(5)认真完成课后作业,有助于你巩固知识点甚至扩展新的内容;

二,ElasticSearch和Solr的选择

Solr是一个开源的,基于Apache Lucene的企业级搜索平台,用于构建高性能,可扩展的搜索应用,他提供了全文搜索,高亮显示,分页搜索,实时索引等功能.
Lucene 一个全文搜索引擎。搜索引擎,全文检索,索引库
lucene的优点:
优点:
可以被认为是迄今为止最先进,性能最好的,功能最全的搜索引擎库(框架)。
缺点:
(1)只能在 Java项目中使用,并且要以jar包的方式直接集成在项目中;
(2)使用很复杂,你需要深入了解检索的相关知识来创建索引和搜索索引代码;
(3) 不支持集 群环境,索引数据不同步(不支持大型项目);
(4) 扩展性差,索引库和应用所在同一个服务器,当索引数据过大时,效率逐渐降低;
值得注意的是,上述的Lucene框架中的缺点,Elasticsearch全部都能解决。
ElasticSearch是一个实时的分布式搜素和分析引擎。他可以帮助你用前所未有的速度去处理大规模数据。
ES 可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
有哪些公司在使用 ElasticSearch呢,全球几乎所有的大型互联网公司都在拥抱这个开源项目:
复制代码
https://www.elastic.co/cn/customers/success-stories
2,ElasticSearch 和 Solr如何选择
Solr是Apache Lucene 项目的开源企业搜索平台,其主要功能包括全文检索,命中标识,分页搜索,动态聚类,数据库集成,以及富文本(如word,PDF)的处理。
Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4还增加了NoSQL支持。
Elasticsearch (下面简称ES)与Solr的比较:
(1) Solr利用 Zookeeper 进行分布式管理,而ES自身带有分布式协调管理功能;
(2) Solr支持更多格式(JSON,XNI,CSV)的数据,而ES仅支持JSON文件格式;
(3) Solr官方提供的功能更多,而ES本身更注重于核心功能,高级功能多有第三方插件提供;
(4) Solr在 "传统搜索"(已有数据)中表现好于ES,但在处理 "实时搜索"(实时建立索引)应用时效明显低于ES.
(5) Solr是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用
有网友在生产环境测试,将搜索引擎从Solr转动Elasticsearch以后的平均查询速度有了将近50倍的提升。

三,集群基础环境初始化

1,准备虚拟机
IP地址 主机名 CPU配置 内存配置 磁盘配置 角色说明
10.0.0.101 elk101 2 core 4G 20G+ ES node
10.0.0.102 elk102 2 core 4G 20G+ ES node
10.0.0.103 elk103 2 core 4G 20G ES node
2, 修改软件源
​

sed -e `a|^mirrorlist=|#mirrorlist=|g` \ -e `a|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g` \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo

参考链接:
https://mirrors.tuna.tsinghua.edu.cn/help/centos/

官网源码:
centos6.10
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
    -e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" \
    -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" \
    -i.bak \
    /etc/yum.repos.d/CentOS-*.repo
    

---
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
    -e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9|g" \
    -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9|g" \
    -i.bak \
    /etc/yum.repos.d/CentOS-*.repo

[点击并拖拽以移动]
​
3, 修改终端颜色
# 有点瑕疵
cat <<EOF>> ~/.bashrc
PS1='[\[\e[34;1m]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\]\W\[\e[0m\]]# '
EOF
source ~/.bashrc

[root@elk189 ~]# cat <<EOF>> ~/.bashrc
> PS1='[\[\e[34;1m]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \W\[\e[0m\]]# '
> EOF
[root@elk189 ~]# source ~/.bashrc

==========================
# 完美
cat <<EOF>> ~/.bashrc
PS1="\[\e[32;40m\][\[\e[31;40m\]\u\[\e[33;40m\]@\h \[\e[32;40m\]\w\[\e[1m\]]\\$ "
EOF
source ~/.bashrc
4, 修改sshd服务优化
sed -ri 's@^#UseDNS yes@UseDNS no@g' /etc/ssh/sshd_config
sed -ri 's#^GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config
grep ^UseDNS /etc/ssh/sshd_config
grep ^GSSAPIAuthentication /etc/ssh/sshd_config


[root@elk188 ~]# sed -ri 's@^#UseDNS yes@UseDNS no@g' /etc/ssh/sshd_config
[root@elk188 ~]# sed -ri 's#^GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config
[root@elk188 ~]# grep ^UseDNS /etc/ssh/sshd_config
UseDNS no
[root@elk188 ~]# grep ^GSSAPIAuthentication /etc/ssh/sshd_config
GSSAPIAuthentication no
5,关闭防火墙
systemctl disable --now firewalld && systemctl is-enabled firewalld
systemctl status firewalld
6,禁用selinux
sed -ri 's#(SELINUX=)enforcing#\1disabled#' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
setenforce 0
getenforce 
7,配置集群免密登录及同步脚本
(1) 修改主机列表
cat >> /etc/hosts << 'EOF'
192.168.222.187 elk187.longchi.xyz
192.168.222.188 elk188.longchi.xyz
192.168.222.189 elk189.longchi.xyz
EOF

(2) elk101节点上生成秘钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa -q
ll ~/.ssh/id_rsa

(3) elk101 配置所有集群节点的免密登录
for ((host_id=187;host_id<=189;host_id++));do ssh-copy-id elk${host_id}.longchi.xyz;done

(4)链接测试
ssh 'elk187.longchi.xyz'
ssh 'elk188.longchi.xyz'
ssh 'elk189.longchi.xyz'

logout # 退出登录


(5) 所有节点安装 rsync 数据同步工具
yum -y install rsync
yum -y install tree

(6) 编写同步脚本
vim /usr/local/sbin/data_rsync.sh # 将下面的内容拷贝到该文件
[root@elk187.longchi.xyz ~]#cat /usr/local/sbin/data_rsync.sh
#!/bin/bash
#Auther: zengguoqing
#encoding: utf-8

if [ $# -ne 1 ];then
    echo "Usage: $0 /path/to/file"
    exit
fi

# 判断文件是否存在
if [ ! -e $1 ];then
    echo "[ $1 ] dir or file not find"
    exit
fi


#获取父路径
fullpath=`dirname $1`

#获取子路径
basename=`basename $1`

#进入父路径
cd $fullpath

for ((host_id=188;host_id<=189;host_id++))
  do
    # 使得终端输出变为绿色
    tput setaf 2
    echo ===== rsyncing elk${host_id}.longchi.xyz: $basename =====
    # 使得终端恢复原来的颜色
    tput setaf 7
    # 将数据同步到其他两个节点
    rsync -az $basename `whoami`@elk${host_id}.longchi.xyz:$fullpath
    if [ $? -eq 0 ];then
      echo "命令执行成功"
    fi
done

	
(7) 给脚本授权
chmod +x /usr/local/sbin/data_rsync.sh


(8) 测试 同步成功(文件,文件夹,软连接都可以同步)

[]root@elk187.longchi.xyz ~]#mkdir /tmp/opt
[]root@elk187.longchi.xyz ~]#echo 1111 > /tmp/opt/1.txt
[]root@elk187.longchi.xyz ~]#ll /tmp/opt/
total 4
-rw-r--r-- 1 root root 5 Oct  2 23:28 1.txt
[]root@elk187.longchi.xyz ~]#cat /tmp/opt/1.txt
1111
[]root@elk187.longchi.xyz ~]#vim /usr/local/sbin/data_rsync.sh
[]root@elk187.longchi.xyz ~]#chmod +x /usr/local/sbin/data_rsync.sh
[]root@elk187.longchi.xyz ~]#data_rsync.sh /tmp/test/
===== rsyncing elk188.longchi.xyz: test =====
命令执行成功
===== rsyncing elk189.longchi.xyz: test =====
命令执行成功


# 测试  同步成功
[]root@elk189.longchi.xyz ~]#ll /tmp/opt
total 4
-rw-r--r-- 1 root root 5 Oct  2 23:28 1.txt
[]root@elk189.longchi.xyz ~]#cat /tmp/opt/1.txt
1111


[]root@elk188.longchi.xyz ~]#ll /tmp/opt/
total 4
-rw-r--r-- 1 root root 5 Oct  2 23:28 1.txt
[]root@elk188.longchi.xyz ~]#cat /tmp/opt/1.txt
1111

# 软链接也是可以同步的
[]root@elk187.longchi.xyz tmp]#ln -sv test t
't' -> 'test'
[]root@elk187.longchi.xyz tmp]#cd
[]root@elk187.longchi.xyz ~]#data_rsync.sh /tmp/t
===== rsyncing elk188.longchi.xyz: t =====
命令执行成功
===== rsyncing elk189.longchi.xyz: t =====
命令执行成功


==============脚本解释 start=============
脚本解释:
[]root@elk187.longchi.xyz ~]#cat /usr/local/sbin/data_rsync.sh
#!/bin/bash
#Auther: zengguoqing
#encoding: utf-8

if [ $# -ne 1 ];then	// 判断传参的个数是否是1 如果没有传参,就直接返回
    echo "Usage: $0 /path/to/file(绝对路径)"	// $0是当前的脚本名称,后面跟
    exit							// 脚本文件的绝对路径
fi

# 判断文件是否存在
if [ ! -e $1 ];then
    echo "[ $1 ] dir or file not find"
    exit
fi


#获取父路径
fullpath=`dirname $1`

#获取子路径
basename=`basename $1`

#进入父路径
cd $fullpath

for ((host_id=188;host_id<=189;host_id++))
  do
    # 使得终端输出变为绿色
    tput setaf 2
    echo ===== rsyncing elk${host_id}.longchi.xyz: $basename =====
    # 使得终端恢复原来的颜色
    tput setaf 7
    # 将数据同步到其他两个节点
    rsync -az $basename `whoami`@elk${host_id}.longchi.xyz:$fullpath
    if [ $? -eq 0 ];then
      echo "命令执行成功"
    fi
done


==============脚本解释 end=============
8,集群时间同步
(1) 安装常用的Linux工具,你可以自定义
yum -y install vim net-tools

(2) 安装 chrony 服务
yum -y install ntpdate chrony

(3) 修改 chrony 服务配置文件
vim /etc/chrony.conf
...
# 注释官方的时间服务器,换成国内的时间服务器即可
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
...

(4)配置 chronyd 的开机自启
systemctl enable --now chronyd

(5) 查看 chronyd 的服务状态
systemctl status chronyd

(6) 重启 chronyd 服务
systemctl restart chronyd
修改主机名
[root@elk187 ~]# hostnamectl set-hostname elk187.longchi.xyz
[root@elk188 ~]# hostnamectl set-hostname elk188.longchi.xyz
[root@elk189 ~]# hostnamectl set-hostname elk189.longchi.xyz


hostnamectl set-hostname model-182.longchi.xyz

[root@elk187 ~]# cat /etc/hostname
elk187.longchi.xyz
[root@elk188 ~]# cat /etc/hostname
elk188.longchi.xyz
[root@elk189 ~]# cat /etc/hostname
elk189.longchi.xyz
vim /etc/hosts 主机名追加
cat >> /etc/hosts << 'EOF'
192.168.222.187 elk187.longchi.xyz
192.168.222.188 elk188.longchi.xyz
192.168.222.189 elk189.longchi.xyz
EOF


[root@elk187 ~]# cat >> /etc/hosts << 'EOF'
> 192.168.222.187 elk187.longchi.xyz
> 192.168.222.188 elk188.longchi.xyz
> 192.168.222.189 elk189.longchi.xyz
> EOF
[root@elk187 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.222.187 elk187.longchi.xyz
192.168.222.188 elk188.longchi.xyz
192.168.222.189 elk189.longchi.xyz
yum源备份
[root@elk188 ~]#  ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo  CentOS-x86_64-kernel.repo
[root@elk188 ~]# cd /etc/yum.repos.d/
[root@elk188 yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo  CentOS-x86_64-kernel.repo
[root@elk188 yum.repos.d]# mkdir bak
[root@elk188 yum.repos.d]# mv C* bak
[root@elk188 yum.repos.d]# ll
total 0
drwxr-xr-x. 2 root root 220 Oct  2 13:55 bak
yum源配置
[root@elk189 ~]# cat /etc/yum.repos.d/yumtest.sh

#!/bin/bash

# 检查wget工具是否安装
if ! command -v wget &> /dev/null; then
    echo "wget未安装,执行yum -y install wget 安装"
    exit 1
fi

# 检查网络连接
ping -c 1 wwww.baidu.com > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "没有网络连接,脚本退出。"
    exit 1
fi

# 创建备份目录
mkdir -p /etc/yum.repos.d/backup

# 备份本地原有CentOS、epel库的yum源
cd /etc/yum.repos.d/
if [ -f "*repo" ]; then
    echo "repo文件存在,开始备份..."
    rm -f /etc/yum.repos.d/backup/*repo  # 删除旧的备份文件
    mv /etc/yum.repos.d/CentOS*.repo /etc/yum.repos.d/backup/
    mv /etc/yum.repos.d/epel*.repo /etc/yum.repos.d/backup/

    echo "备份完成!"
else
    echo "repo文件不存在,准备新建CentOS 7 yum源"
fi

# 获取系统类型和版本ID
distro=$(cat /etc/os-release | grep '^ID=' | cut -d '=' -f 2 | tr -d '"')
osversion=$(cat /etc/os-release | grep '^VERSION_ID' | cut -d '=' -f 2 | tr -d '"')

# 判断系统类型和版本并配置yum源
if [ "$distro" = "centos" ]; then
    if [ "$osversion" = "7" ]; then
        # CentOS 7 repo
        wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo >/dev/null 2>&1

        # epel 7 repo
        wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo >/dev/null 2>&1

        if [ $? -eq 0 ]; then  # 检查wget是否成功
            echo "CentOS 7 yum源配置完成。"
            # 更新yum软件包仓库

            yum clean all
            yum makecache
            yum repolist
        else
            echo "无法获取CentOS 7 yum源,请检查网络或源地址。"
        fi
    else
        echo "非 CentOS 7 系统,请手动添加yum源。"
    fi
else
    echo "非 CentOS 系统,请手动添加yum源。"
fi

[root@elk189 ~]# cd /etc/yum.repos.d/
[root@elk189 yum.repos.d]# ll
total 4
drwxr-xr-x. 2 root root  220 Oct  2 13:56 bak
-rw-r--r--. 1 root root 1843 Oct  2 15:32 yumtest.sh
[root@elk189 yum.repos.d]# bash yumtest.sh
repo文件不存在,准备新建CentOS 7 yum源
CentOS 7 yum源配置完成。
Loaded plugins: fastestmirror, langpacks
Cleaning repos: base epel extras updates
Cleaning up list of fastest mirrors
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com

.....

四,ElasticSearch单点部署

1. 下载指定的ES版本
详细步骤见视频。
参考链接:
Elastic官网
https://www.elastic.co/cn/dowmloads/elasticsearch
https://www.elastic.co/

ElasticSearch官网:
https://www.elastic.co/cn/elasticsearch

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-x86_64.rpm
2, 部署JDK环境-可选步骤
官方链接:
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

https://www.oracle.com/java/technologies/downloads/#java8
https://www.oracle.com/java/technologies/downloads/

https://download.oracle.com/otn/java/jdk/8u321-b07/df5ad55fdd604472a86a45a217032c7d/jdk-8u321-linux-x64.rpm

https://download.oracle.com/otn/java/jdk/8u321-b07/df5ad55fdd604472a86a45a217032c7d/jdk-8u321-linux-x64.tar.gz

elk187节点部署oracle jdk步骤:
(1)创建目录
mkdir -pv /oldboyedu/softwares
(2)解压JDK到指定的目录
tar xf jdk-8u321-linux-x64.tar.gz -C /oldboyedu/softwares/

(3) 创建符号链接
cd /oldboyedu/softwares/ && ln -sv jdk1.8.0_321 jdk

(4) 创建环境变量
cat > /etc/profile.d/elk.sh << 'EOF'
#!/bin/bash

export JAVA_HOME=/oldboyedu/softwares/jdk
export PATH=$PATH:$JAVA_HOME/bin
EOF

source /etc/profile.d/elk.sh

vim /etc/profile.d/elk.sh
cat /etc/profile.d/elk.sh

(5)查看JDK的版本号
java -version

(6) 同步jdk环境到其他节点
data_rsync.sh /oldboyedu/
data_rsync.sh /etc/profile.d/elk.sh

(7) 其他节点测试
source /etc/profile.d/elk.sh
java -version

3,单点部署elasticsearch

(1) 安装服务
yum -y localinstall elasticsearch-7.17.3-x86_64.rpm

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service
systemctl cat elasticsearch

(2) 修改配置文件
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: oldboyedu-elk
node.name:oldboyedu-elk103
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.hosts: 10.0.0.103
discovery.seed_hosts:["10.0.0.103"]


相关参数说明:
cluster.name: oldboyedu-elk
集群名称,若不指定,则默认是 "elasticsearch",日志文件的前缀也是集群名称

node.name:oldboyedu-elk103
指定节点的名称,可以自定义,推荐使用当前的主机名,要求集群唯一

path.data: /var/lib/elasticsearch
数据路径

path.logs: /var/log/elasticsearch
日志路径

network.host: 10.0.0.103  第一种方式
network.host: 0.0.0.0    表示当前节点的所有IP地址都可以访问 第二种方式
ES服务监听的IP地址

discovery.seed_hosts: ["10.0.0.103"]	第一种方式
discovery.seed_hosts: ["elk187.longchi.xyz"]	第二种方式
服务发现的主机列表,对于单点部署而言,主机列表 "network.host" 字段配置相同即可

(3) 启动服务
systemctl start elasticsearch.service
systemctl enable elasticsearch.service
systemctl status elasticsearch.service

(4) 查看 ss -ntl
[]root@elk187.longchi.xyz ~]#ss -ntl
State Recv-Q Send-Q   Local Address:Port       Peer Address:Port
LISTEN 0     128      *:111                             *:*
LISTEN 0      5     192.168.122.1:53                    *:*
LISTEN 0     128      *:22                              *:*
LISTEN 0     128    127.0.0.1:631                       *:*
LISTEN 0     100    127.0.0.1:25                        *:*
LISTEN 0     128    127.0.0.1:6010                      *:*
LISTEN 0     128    [::]:111                           [::]:*
LISTEN 0     128    [::ffff:192.168.222.187]:9200      [::]:*
LISTEN 0     128    [::ffff:192.168.222.187]:9300      [::]:*
LISTEN 0     128    [::]:22                            [::]:*
LISTEN 0     128    [::1]:631                          [::]:*
LISTEN 0     100    [::1]:25                           [::]:*
LISTEN 0     128    [::1]:6010                         [::]:*


# 解释参数:
'9200' ES:9200 端口是集群对外提供的一个端口,主要是提供的HTTP协议
		主要是提供的HTTP协议,主要作数据交互(集群内部与集群外部)
		即可以通过浏览器9200访问集群内部。

'9300' ES:9300 集群内部各节点通信通过9300端口交换数据
		9300 端口使用的是TCP协议
查看集群主日志 tail -100f /var/log/elasticsearch/longchi-elk.log
[root@elk187.longchi.xyz ~]#ll /var/log/elasticsearch/longchi-elk.log
-rw-r--r-- 1 elasticsearch elasticsearch 239751 Oct  4 01:36 /var/log/elasticsearch/longchi-elk.log
[]root@elk187.longchi.xyz ~]#tail -100f /var/log/elasticsearch/longchi-elk.log
通过9200端口访问
curl 127.0.0.1:9200
{
  "name": "elk101.oldboyedu.com",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "kzvSLczpRNCeXJbUJcCJoQ",
  "version": {
    "number": "7.17.3",
    "build_flavor": "default",
    "build_type": "rpm",
    "build_hash": "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
    "build_date": "2022-04-19T08:11:19.070913226z",
    "build_snapshot": false,
    "lucene_version": "8.11.1",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  }
  "tagline": "You Know,for Search"
}
4, OpenJDK切换Orcle jdk并修改堆内存大小
(1) 修改ES的环境变量配置文件
vim /etc/sysconfig/elasticsearch
...
ES_JAVA_HOME=/longchi/softwares/jdk


(2) 修改堆内存大小
vim /etc/elasticsearch/jvm.options
...
-Xms256m
-Xmx256m

(3) 验证堆内存大小
jmap -heap `ps -ef | grep java | grep -v grep | awk '{print $2}'`

(4) 同步配置文件到其他节点
data_rsync.sh /etc/sysconfig/elasticsearch
data_rsync.sh /etc/elasticsearch/jvm.options

五,ElasticSearch 分布式集群部署

1, elk101 修改配置文件
vim /etc/elasticsearch/elasticsearch.yml
...
cluster.name: oldboyedu-elk
node.name: elk101
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk101","elk102","elk103"]
cluster.initial_master_nodes: ["elk101","elk102","elk103"]
2,同步配置文件到集群的其他节点
(1) elk101同步配置文件到集群的其他节点
data_rsync.sh /etc/elasticsearch/elasticsearch.yml

(2) elk102节点配置
vim /etc/elasticsearch/elasticsearch.yml
...
node.name: elk102

(3) elk103节点配置
vim /etc/elasticsearch/elasticsearch.yml
...
node.name: elk103

----------------
启动服务前先执行 rm -rf /var/{lib,log}/elasticsearch/*

三个节点同时启动
systemctl daemon-reload
systemctl start elasticsearch.service
systemctl status elasticsearch.service
systemctl restart elasticsearch.service



# 187.188.189 同时测试出现如返回表示集群搭建成功
[root@elk188 ~]$ curl 192.168.222.188:9200/_cat/nodes
192.168.222.189 17 97 0 0.16 0.07 0.11 cdfhilmrstw * elk189.longchi.xyz
192.168.222.187 51 41 0 0.03 0.04 0.05 cdfhilmrstw - elk187.longchi.xyz
192.168.222.188 15 97 0 0.02 0.04 0.09 cdfhilmrstw - elk188.longchi.xyz
[root@elk188 ~]$


[root@elk189 ~]$ curl 192.168.222.189:9200/_cat/nodes
192.168.222.188 15 97 0 0.01 0.04 0.09 cdfhilmrstw - elk188.longchi.xyz
192.168.222.187 54 41 0 0.08 0.06 0.05 cdfhilmrstw - elk187.longchi.xyz
192.168.222.189 17 97 0 0.09 0.07 0.10 cdfhilmrstw * elk189.longchi.xyz
[root@elk189 ~]$


[root@elk187 ~]$ curl 192.168.222.187:9200/_cat/nodes
192.168.222.188 15 97 0 0.08 0.05 0.10 cdfhilmrstw - elk188.longchi.xyz
192.168.222.187 46 41 0 0.08 0.06 0.05 cdfhilmrstw - elk187.longchi.xyz
192.168.222.189 16 97 0 0.00 0.03 0.10 cdfhilmrstw * elk189.longchi.xyz
[root@elk187 ~]$


# 187,188,189集群配置如下
[root@elk187 ~]$ egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: longchi-elk
node.name: elk187.longchi.xyz
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
cluster.initial_master_nodes: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
[root@elk187 ~]$


[root@elk188 ~]$ egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: longchi-elk
node.name: elk188.longchi.xyz
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
cluster.initial_master_nodes: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
[root@elk188 ~]$



[root@elk189 ~]$ egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: longchi-elk
node.name: elk189.longchi.xyz
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
cluster.initial_master_nodes: ["elk187.longchi.xyz","elk188.longchi.xyz","elk189.longchi.xyz"]
[root@elk189 ~]$



# 表示已经成功搭建好集群
[root@elk189 ~]$ curl 192.168.222.189:9200
{
  "name" : "elk189.longchi.xyz",
  "cluster_name" : "longchi-elk",
  "cluster_uuid" : "DrM-yzthQDSJdL0Jz2JjnA", 
  "version" : {
    "number" : "7.17.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
    "build_date" : "2022-04-19T08:11:19.070913226Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[root@elk189 ~]$

# 以下表示三台主机在同一个机器 他们的 "cluster_uuid" 值相同
[root@elk187 ~]$ "cluster_uuid" : "DrM-yzthQDSJdL0Jz2JjnA",
[root@elk188 ~]$ "cluster_uuid" : "DrM-yzthQDSJdL0Jz2JjnA",
[root@elk189 ~]$ "cluster_uuid" : "DrM-yzthQDSJdL0Jz2JjnA",

3,所以节点删除之前的临时数据

pkill java
rm -rf /var/{lib,log}/elasticsearch/* /tmp/*
ll /var/{lib,log}/elasticsearch/ /tmp/

4, 所有节点启动 elasticsearch 服务

(1)所有节点启动服务
systemctl daemon-reload
systemctl start elasticsearch
curl 127.0.0.1:9200/_cat/nodes

(2)启动过程中建议看日志
tail 100f /var/log/elasticsearch/longchi-elk.log

大模型选择
大模型排行榜网址:https://www.superclueai.com

Ollama官网
官网:https://ollama.com/

Ollama官网下载
https://ollama.com/download

5, 验证机器是否正常

curl elk187.longchi.xyz:9200/_cat/node?v
curl 192.168.222.187:9200/_cat/node

# 以下表示机器部署成功
[root@elk188 ~]$ curl elk188.longchi.xyz:9200/_cat/nodes
192.168.222.189 34 88 0 0.03 0.02 0.05 cdfhilmrstw * elk189.longchi.xyz
192.168.222.188 24 86 0 0.12 0.04 0.05 cdfhilmrstw - elk188.longchi.xyz
192.168.222.187 37 44 0 0.06 0.04 0.05 cdfhilmrstw - elk187.longchi.xyz
[root@elk188 ~]$ curl 192.168.222.188:9200/_cat/nodes
192.168.222.189 34 88 0 0.01 0.02 0.05 cdfhilmrstw * elk189.longchi.xyz
192.168.222.188 24 86 0 0.10 0.05 0.06 cdfhilmrstw - elk188.longchi.xyz
192.168.222.187 40 44 0 0.03 0.04 0.05 cdfhilmrstw - elk187.longchi.xyz
[root@elk188 ~]$

六,部署 kibana 服务

下载软件 

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.3-x86_64.rpm
1,本地安装kibana服务
yum -y localinstall kibana-7.17.3-x86_64.rpm
2, 修改 kibana 的配置文件
vim /etc/kibana/kibana.yml
...
server.host: "10.0.0.101"
server.name: "longchi-kibana-server"
elasticsearch.hosts: ["http://10.0.0.101:9200","http://10.0.0.102:9200","http://10.0.0.103:9200"]
il8n.locale: "zh-CN"
-------------------
k8s-->kubernetes
i18n-->internationalization
internationalization and localization

实操 '0.0.0.0' 表示绑定当前主机的所有网卡
[root@elk187 ~]$ egrep -v "^#|^$" /etc/kibana/kibana.yml
server.host: "0.0.0.0"
server.name: "longchi-elk"
elasticsearch.hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
i18n.locale: "zh-CN"

3, 启动 kibana 服务

systemctl daemon-reload
systemctl enable --now kibana
systemctl status kibana

# 查看 kibana 自启动服务文件
systemctl cat kibana

4, 访问 kibana 的webUI

http://192.168.222.187:5601/app/home#/

七,filebeat 环境部署

filebeat介绍
filebeat是一个用于转发和收集日志数据的轻量级托运工具,监控日志文件或指定的本地路径,收集日志事件,并转发到Elasticsearch和Logstash用于检索。 Filebeat工作介绍:当启动Filebeat时,它启动一个或多个输入,这些输入查看为日志数据指定的位置。对于Filebeat定位的每个日志,Filebeat都会启动一个收集器。每个收集器读取单个日志以获取新内容,并将新日志数据发送给libbeat, libbeat聚合事件并将聚合的数据发送到为Filebeat配置的输出。
filebeat官网:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
1, 部署 filebeat 环境部署
yum -y localinstall filebeat-7.17.3-x86_64.rpm
温馨提示:
	elk102节点操作。
	
	
查看filebeat的版本
[root@elk188 ~]$ filebeat version
filebeat version 7.17.3 (amd64), libbeat 7.17.3 [1993ee88a11cb34f61a1fb45c7c3cf50533682cb built 2022-04-19 09:27:20 +0000 UTC]


# 从 log 本地拿数据,参考文档:
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html
查看 filebeat 自启动配置文件
[root@elk188 ~]$ systemctl cat filebeat
# /usr/lib/systemd/system/filebeat.service
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Documentation=https://www.elastic.co/beats/filebeat
Wants=network-online.target
After=network-online.target

[Service]

Environment="GODEBUG='madvdontneed=1'"
Environment="BEAT_LOG_OPTS="
Environment="BEAT_CONFIG_OPTS=-c /etc/filebeat/filebeat.yml"
Environment="BEAT_PATH_OPTS=--path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat"
ExecStart=/usr/share/filebeat/bin/filebeat --environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS
Restart=always

[Install]
WantedBy=multi-user.target
查看过滤后的 filebeat 配置文件
[root@elk188 ~]$ egrep -v "^*#|^$" /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
  enabled: false
  paths:
    - /var/log/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.elasticsearch:
  hosts: ["localhost:9200"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
对 filebeat 配置文件进行更名
mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml-`date +%F`

[root@elk188 ~]$ ll /etc/filebeat/
total 3880
drwxr-xr-x 2 root root       6 Oct 12 16:23 config
-rw-r--r-- 1 root root 3780088 Apr 19  2022 fields.yml
-rw-r--r-- 1 root root  170239 Apr 19  2022 filebeat.reference.yml
-rw------- 1 root root    8273 Oct 12 17:12 filebeat.yml
drwxr-xr-x 2 root root    4096 Oct 12 16:20 modules.d

# 更名
[root@elk188 ~]$ mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml-`date +%F`
[root@elk188 ~]$ ll /etc/filebeat/
total 3880
drwxr-xr-x 2 root root       6 Oct 12 16:23 config
-rw-r--r-- 1 root root 3780088 Apr 19  2022 fields.yml
-rw-r--r-- 1 root root  170239 Apr 19  2022 filebeat.reference.yml
-rw------- 1 root root    8273 Oct 12 17:12 filebeat.yml-2024-10-12
drwxr-xr-x 2 root root    4096 Oct 12 16:20 modules.d
[root@elk188 ~]$
2,修改 filebeat的配置文件
(1) 编写测试的配置文件
mkdir /etc/filebeat/config -pv
cat > /etc/filebeat/config/01-stdin-to-console.yml << 'EOF'
# 指定输入的类型
filebeat.inputs:
# 指定输入的类型为 "stdin",表示标准输入
- type: stdin

# 指定输出的类型
output.console:
  # 打印漂亮的格式
  pretty: true
EOF
(2)运行 filebeat 实例
filebeat -e -c /etc/filebeat/config/01-stdin-to-console.yml

(3) 测试

[root@elk188 ~]$ vim /etc/filebeat/filebeat.yml
[root@elk188 ~]$ cat /etc/filebeat/filebeat.yml
# 指定输入的类型
filebeat.inputs:
# 指定输入的类型为 "stdin",表示标准输入
- type: stdin

# 指定输出的类型
output.console:
  # 打印漂亮的格式
  pretty: true

[root@elk188 /tmp]$ echo 1111 > test.log
[root@elk188 /tmp]$ echo 2222 >> test.log
[root@elk188 /tmp]$ more test.log
1111
2222
[root@elk188 /tmp]$ echo -n 3333 >> test.log  '-n' 去掉换行符



[root@elk188 /tmp]$ ll /tmp/test.log
-rw-r--r-- 1 root root 19 Oct  6 22:14 /tmp/test.log




[root@elk188 ~]$ ll /var/lib/filebeat/registry/filebeat
total 8
-rw------- 1 root root 2025 Oct  6 18:59 log.json
-rw------- 1 root root   15 Oct  6 14:23 meta.json


[root@elk188 ~]$ cat  /var/lib/filebeat/registry/filebeat/log.json
{"op":"set","id":1}
{"k":"filebeat::logs::","v":{"FileStateOS":{"inode":0,"device":0},"prev_id":"","offset":12,"timestamp":[279671284005235,1728249848],"ttl":0,"type":"","identifier_name":"","id":"","source":""}}
{"op":"set","id":2}
{"k":"filebeat::logs::","v":{"identifier_name":"","id":"","prev_id":"","source":"","offset":5,"ttl":0,"type":"","FileStateOS":{"inode":0,"device":0},"timestamp":[279671418128480,1728249976]}}
{"op":"set","id":3}
{"k":"filebeat::logs::","v":{"timestamp":[279671418128480,1728249976],"ttl":0,"identifier_name":"","id":"","prev_id":"","source":"","offset":5,"type":"","FileStateOS":{"inode":0,"device":0}}}
{"op":"set","id":4}
{"k":"filebeat::logs::native::0-0","v":{"prev_id":"","type":"","FileStateOS":{"inode":0,"device":0},"id":"native::0-0","offset":5,"timestamp":[279671418128480,1728249976],"ttl":-2,"identifier_name":"native","source":""}}
{"op":"set","id":5}
{"k":"filebeat::logs::","v":{"id":"","timestamp":[279671256823595,1728252729],"ttl":0,"identifier_name":"","prev_id":"","source":"","offset":5,"type":"","FileStateOS":{"inode":0,"device":0}}}
{"op":"set","id":6}
{"k":"filebeat::logs::native::0-0","v":{"type":"","FileStateOS":{"inode":0,"device":0},"offset":5,"ttl":-2,"source":"","timestamp":[279671418128480,1728249976],"identifier_name":"native","id":"native::0-0","prev_id":""}}
{"op":"set","id":7}
{"k":"filebeat::logs::","v":{"id":"","timestamp":[279671256823595,1728252729],"type":"","FileStateOS":{"inode":0,"device":0},"identifier_name":"","prev_id":"","source":"","offset":5,"ttl":0}}
{"op":"set","id":8}
{"k":"filebeat::logs::native::0-0","v":{"id":"native::0-0","FileStateOS":{"inode":0,"device":0},"identifier_name":"native","type":"","prev_id":"","source":"","offset":5,"timestamp":[279671256823595,1728252729],"ttl":-2}}
{"op":"set","id":9}
{"k":"filebeat::logs::native::0-0","v":{"ttl":-2,"type":"","FileStateOS":{"inode":0,"device":0},"identifier_name":"native","id":"native::0-0","prev_id":"","source":"","offset":5,"timestamp":[279671256823595,1728252729]}}

[root@elk188 ~]$ cat  /var/lib/filebeat/registry/filebeat/meta.json
{"version":"1"}




[root@elk188 ~]$ filebeat -e -c /etc/filebeat/filebeat.yml

8888
{
  "@timestamp": "2024-10-06T21:26:15.325Z",	#时间戳,当前的时间
  "@metadata": {		# 元数据信息
    "beat": "filebeat",	# beat使用的是什么beat
    "type": "_doc",		# 文档类型
    "version": "7.17.3"	# filebeat 的版本号
  },
  "log": {		# 读取了哪些文件
    "offset": 0,	# 偏移量没有
    "file": {		#
      "path": ""	#
    }
  },
  "message": "8888",	# 实际输入的信息
  "input": {		# 输入信息
    "type": "stdin"		# 输入类型,标准输入
  },
  "ecs": {	# 云服务端的信息
    "version": "1.12.0"	# 
  },
  "host": {	# 主机
    "name": "elk188.longchi.xyz"	# 当前的主机名
  },
  "agent": {	# 当前客户端信息
    "ephemeral_id": "c4bff02c-7f42-40bb-aa0c-b0299958c725",
    # 
    "id": "5d9ba997-37da-4163-81e2-ac5f2182d98a",
    # 
    "name": "elk188.longchi.xyz",
    # 
    "type": "filebeat",
    # 
    "version": "7.17.3",
    # 
    "hostname": "elk188.longchi.xyz"
    # 
  }
}

2024-10-06T14:26:16.327-0700    ERROR   file/states.go:125      State for  should have been dropped, but couldn't as state is not finished.

2024-10-06T14:26:19.421-0700    INFO    [monitoring]    log/log.go:184  Non-zero metrics in the last 30s        {"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":360,"time":{"ms":8}},"total":{"ticks":420,"time":{"ms":8},"value":420},"user":{"ticks":60}},"handles":{"limit":{"hard":4096,"soft":1024},"open":10},"info":{"ephemeral_id":"c4bff02c-7f42-40bb-aa0c-b0299958c725","uptime":{"ms":180672},"version":"7.17.3"},"memstats":{"gc_next":19958064,"memory_alloc":11684128,"memory_sys":262144,"memory_total":60022392,"rss":104947712},"runtime":{"goroutines":28}},"filebeat":{"events":{"added":1,"done":1},"harvester":{"open_files":0,"running":1}},"libbeat":{"config":{"module":{"running":0}},"output":{"events":{"acked":1,"active":0,"batches":1,"total":1},"write":{"bytes":604}},"pipeline":{"clients":1,"events":{"active":0,"published":1,"total":1},"queue":{"acked":1}}},"registrar":{"states":{"current":1,"update":1},"writes":{"success":1,"total":1}},"system":{"load":{"1":0.03,"15":0.61,"5":0.7,"norm":{"1":0.015,"15":0.305,"5":0.35}}}}}}




[root@elk188 ~]$ egrep -v "^*#|^$" /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
  enabled: false
  paths:
    - /var/log/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.elasticsearch:
  hosts: ["localhost:9200"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
3,修改filebeat的日志输出到终端
[root@elk188 ~]$ cat /etc/filebeat/config/02.log_to_console.yml
filebeat.inputs:
- type: log
  paths:
    - /tmp/test.log

output.console:
  pretty: true


备注:log.json 他记录了各个文件的 "offset"

# filebeat如何读取指定数据的原理
filebeat如何读取指定数据的原理: 换行读取
[root@elk188 ~]$ ll /tmp/test.log
-rw-r--r-- 1 root root 24 Oct 13 22:42 /tmp/test.log
[root@elk188 ~]$ ll /var/lib/filebeat/registry/filebeat/
total 16
-rw------- 1 root root 12032 Oct 13 23:47 log.json
-rw------- 1 root root    16 Oct 13 21:56 meta.json
[root@elk188 ~]$ vim /var/lib/filebeat/registry/filebeat/log.json
{"op":"set","id":31}
{"k":"filebeat::logs::native::20101024-2051","v":{"prev_id":"","source":"/tmp/test.log","ttl":-1,"FileStateOS":{"inode":20101024,"device":2051},"identifier_name":"native","id":"native::20101024-2051","offset":24,"timestamp":[279671438170877,1728884555],"type":"log"}}

通过修改 'vim /var/lib/filebeat/registry/filebeat/log.json' 该文件中最后一行中的偏移量 'offset' 的值,就可以读取指定的日志。

"source":"/tmp/test.log"	# 表示 'filebeat' 收集源文件


# 'meta.json'记录版本信息
[root@elk188 ~]$ cat /var/lib/filebeat/registry/filebeat/meta.json
{"version":"1"}

filebeat是根据(比如'/tmp/test.log')源文件和偏移量('offset":24')进行数据收集


# 可以直接删除 '/var/lib/filebeat/registry/filebeat/' 目录下的数据,然后从头开始读取数据,即 'rm -rf /var/lib/filebeat/*'  
注意: 生产环境一般不要这样删除 log.json 的数据
如果你启动了 filebeat 实例,他还会去增加一个 'filebeat.lock' 锁文件,锁文件主要是占位作用,目的就是当前数据已经被 filebeat 实例使用了,所以你不能多个 filebeat 实例使用同一个数据目录。
[root@elk188 ~]$ cat /var/lib/filebeat/registry/filebeat/log.json
{"op":"set","id":1}
{"k":"filebeat::logs::native::20101024-2051","v":{"FileStateOS":{"inode":20101024,"device":2051},"source":"/tmp/test.log","offset":0,"timestamp":[279671657789998,1728890428],"ttl":-1,"id":"native::20101024-2051","prev_id":"","type":"log","identifier_name":"native"}}


[root@elk188 ~]$ cat config/02-log-to-console.yml
filebeat.inputs:
- type: log
  paths:
    - /tmp/test.log


output.console:
  pretty: true
4, 基于模块采集 nginx 日志文件
filebeat.config.modules:
  # 指定模块的配置文件路径,如果是 yum 方式安装,在 7.17.3版本中不能使用如下的默认值。
  # path: $(path.config)/modules.d/*.yml
  # 经过实际测试,推荐大家使用如下的配置,此处写绝对路径即可;而对于二进制部署无需做此操作,
  path: /etc/filebeat/modules.d/*.yml
  # 开启热加载功能
  reload.enabled: true
  

output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "oldboyedu-linux-nginx-access-%{+yyyy.MM.dd}"
  
  
# 禁用索引生命周期管理
setup.ilm.enabled: false
# 设置索引模板的名称
setup.template.name: "oldboyedu-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "oldboyedu-linux*"
# 覆盖已有的索引模板,如果为 true,则会直接覆盖现有的索引模板,如果为 false则不覆盖;
setup.template.overwrite: true
# 配置索引模板:
setup.template.settings:
  # 设置分片数量
  index.number_of_shards: 3
  # 设置副本数量,要求小于集群数的数量
  index.number_of_replicas: 0
5,filebeat各种配置文件实例
除了自定义字段外,其他都为源数据字段
# 禁用索引生命周期管理,若开启,上面的 index 配置将无效
setup.ilm.enabled: false
# 设置索引模板的名称
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 匹配索引模板参数
setup.template.settings:
  # 设置分片数量
  index.number_of_shards: 3
  # 设置副本数量,要求小于集群数的数量
  index.number_of_replicas: 0
  

# 实例
1)标准输入输出 终端调试输出
[root@elk188 ~]$ cat config/01-stdin-to-console.yml
# 指定输入的类型
filebeat.inputs:
# 指定输入的类型为 "stdin",表示标准输入
- type: stdin


# 指定输出类型
output.console:
  # 打印漂亮的格式
  pretty: true

2)日志在终端输出
[root@elk188 ~]$ cat config/02-log-to-console.yml
filebeat.inputs:
- type: log
  paths:
    - /tmp/test.log


output.console:
  pretty: true


3)对 '/tmp/test.log'和 '/tmp/*.txt'这个两个文件做日志收集
[root@elk188 ~]$ cat config/03-log-to-console.yml
filebeat.inputs:
- type: log
  paths:
    - /tmp/test.log
    - /tmp/*.txt


output.console:
  pretty: true


rm -rf /var/lib/filebeat/*   # 删除数据
filebeat -e -c /etc/filebeat/config/03-log-to-console.yml  # 启动实例
filebeat启动实例,会产生一个锁文件'filebeat.lock'
[root@elk188 ~]$ ll /var/lib/filebeat/
total 4
-rw------- 1 root root   0 Oct 14 22:43 filebeat.lock
-rw------- 1 root root 100 Oct 14 22:43 meta.json
drwxr-x--- 3 root root  22 Oct 14 22:43 registry

# 创建一个文件 配置文件中没有该文件,我们可以发现 filebeat 是收集不到该文件的数据
[root@elk188 ~]$ echo kafka >> /tmp/kafka.log
# 创建一个文件 与配置文件中 '/tmp/*.txt'可以匹配,此时filebeat可以收集到该文件数据
[root@elk188 ~]$ echo kafka >> /tmp/kafka.txt  此时 'offset'的值为0
# 再次追加,此时filebeat收集到的 'offset' 值为6,可以看出filebeat收集为上次 'offset' 执行的值 
[root@elk188 ~]$ echo zookeeper >> /tmp/kafka.txt
[root@elk188 ~]$ ll /tmp/kafka.txt
-rw-r--r-- 1 root root 16 Oct 14 23:01 /tmp/kafka.txt


# 支持多个文件扩展 使用场景 '/var/lib/docker/.../xdxx'
[root@elk188 ~]$ mkdir -p /tmp/test/elk
[root@elk188 ~]$ echo 2222 >> /tmp/test/elk/1.log
[root@elk188 ~]$ mkdir -p /tmp/test/kafka
[root@elk188 ~]$ echo 1111 >> /tmp/test/kafka/1.log
[root@elk188 ~]$ cat config/04-log-to-console.yml
filebeat.inputs:
- type: log
  paths:
    - /tmp/test.log
    - /tmp/*.txt

- type: log
  paths:
    - /tmp/test/*/*.log


output.console:
  pretty: true
  
  
# 'enabled'是filebeat对日志收集启用(true)和禁用(false)
[root@elk188 ~]$ cat config/04-log-to-console.yml
filebeat.inputs:
- type: log
  enabled: false
  paths:
    - /tmp/test.log
    - /tmp/*.txt

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log


output.console:
  pretty: true

执行以下命令可以看到启用与禁用结果
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c config/04-log-to-console.yml

# 通用字段为【enabled,tags,field,field_under_root,processors,pipeline,keep_null,index,publisher_pipeline.disable_host】
[root@elk188 ~]$ cat config/04-log-to-console.yml
filebeat.inputs:
- type: log
  enabled: false
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  tags: ["longchi-linux"]

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python"]


output.console:
  pretty: true


执行以下命令可以看到自定义tags标签(里面放的是一个个的值)
rm -rf /var/lib/filebeat/*
filebeat -e -c config/04-log-to-console.yml
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c config/04-log-to-console.yml


# 增加通用字段
[root@elk188 ~]$ cat config/04-log-to-console.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  tags: ["longchi-linux","容器运维","DBA运维","SRE运维工程师"]
  field:
    school: "北京昌平区沙河镇"
    class: "linux80"


- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生运维"]


output.console:
  pretty: true

执行以下命令可以看到自定义filed字段(key-value)形式展示,以后可以取出值
rm -rf /var/lib/filebeat/*
filebeat -e -c config/04-log-to-console.yml
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c config/04-log-to-console.yml
{
  "@timestamp": "2024-10-15T21:43:45.288Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.3"
  },
  "host": {
    "name": "elk188.longchi.xyz"
  },
  "agent": {
    "name": "elk188.longchi.xyz",
    "type": "filebeat",
    "version": "7.17.3",
    "hostname": "elk188.longchi.xyz",
    "ephemeral_id": "0e0e2d4c-8e0c-4afd-a6cf-1c6d16c2f761",
    "id": "132e1803-5bd6-417c-8dd6-251836669c7c"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": "/tmp/test.log"
    }
  },
  "message": "1111",
  "tags": [		
  # 展示的是一个个的值,tags通常只是做一个判断,若非要访问,以下标(0,1等)的方式访问
    "longchi-linux",
    "容器运维",
    "DBA运维",
    "SRE运维工程师"
  ],
  "input": {
    "type": "log"
  },
  "fields": {						# 是以 key-value值的形式展示
    "class": "linux80",
    "school": "北京昌平区沙河镇"
  },
  "ecs": {
    "version": "1.12.0"
  }
}
除了自定义字段外,其他都为源数据字段



4) 增加字段
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ vim /etc/filebeat/config/04.log_to_console.yml
[root@elk188 ~]$ cat /etc/filebeat/config/04.log_to_console.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true	# 启用或禁用
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.console:
  pretty: true


5) 输出到ES集群
[root@elk188 ~]$ cat /etc/filebeat/config/05-log-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.elasticsearch:
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]




[root@elk188 ~]$ ll  /var/lib/filebeat/
total 4
-rw------- 1 root root   0 Oct  7 23:29 filebeat.lock
-rw------- 1 root root 100 Oct  6 14:23 meta.json
drwxr-x--- 3 root root  22 Oct  7 23:14 registry



[root@elk188 ~]$ rm -rf /var/lib/filebeat/registry
[root@elk188 ~]$ filebeat -e -c /etc/filebeat/config/04.log_to_console.yml

[root@elk188 ~]$ filebeat -e -c config/03.log_to_console.yml
2024-10-07T03:17:56.350-0700    INFO    instance/beat.go:685    
Home path: [/usr/share/filebeat] 
Config path: [/etc/filebeat] 
Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat] 
Hostfs Path: [/]

# output 输出包括【Elasticsearch Service,Elasticsearch,Logstash,Kafka,Redis,File,Console,Change the output codec】
以上输出都是在console,下面演示实例在 elasticsearch 集群输出

[root@elk188 ~]$ cp config/05.log_to_es.yml config/06.log_to_es.yml
[root@elk188 ~]$ cp /etc/filebeat/config/05.log_to_es.yml /etc/filebeat/config/06.log_to_es.yml
[root@elk188 ~]$ vim config/06.log_to_es.yml


6) 配置索引,索引模式,关闭索引生命周期管理
[root@elk188 ~]$ vim /etc/filebeat/config/06.log_to_es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/06.log_to_es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"



output.elasticsearch:
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-elk-%{+yyyy.MM.dd}"


# 禁用索引生命周期管理,若开启,上面的 index 配置将无效
setup.ilm.enabled: false
# 设置索引模板的名称
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"


[root@elk188 ~]$ vim config/06.log_to_es.yml
[root@elk188 ~]$ cat config/06.log_to_es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189"]
  index: "longchi-linux-elk-%{+yyyy.MM.dd}"


setup.ilm.enabled: false
setup.template.name: "longchi-linux"
setup.template.pattern: "longchi-linux*"
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c /etc/filebeat/config/06.log_to_es.yml


7) 配置多个index(indices) 
# 使用多索引模式(indices),一个配置文件可以输出到不同的索引
[root@elk188 ~]$ cp config/06.log_to_es.yml config/07.log_to_es.yml
[root@elk188 ~]$ cp /etc/filebeat/config/06.log_to_es.yml /etc/filebeat/config/07.log_to_es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/07.log_to_es.yml
[root@elk188 ~]$ vim config/07.log_to_es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/07.log_to_es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/07.log_to_es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"



output.elasticsearch:
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-linux-elk-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "longchi-linux80"
    - index: "longchi-linux-python-%{+yyyy.MM.dd}"
      when.contains:
        tags: "longchi-python"


# 禁用索引生命周期管理,若开启,上面的 index 配置将无效
setup.ilm.enabled: false
# 设置索引模板的名称
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"

[root@elk188 ~]$ vim config/07.log_to_es.yml
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c config/07.log_to_es.yml


2024-10-16T19:47:59.500-0700    INFO    [input.harvester]       log/harvester.go:309    Harvester started for paths: [/tmp/test/*/*.log]        {"input_id": "5e168c0d-861e-4a69-977b-cf3743a4904c", "source": "/tmp/test/kafka/hosts.log", "state_id": "native::3534969-2051", "finished": false, "os_id": "3534969-2051", "harvester_id": "d9a9c1fd-9e4f-4acf-a3cc-a6caee5045ad"}


8)如何在配置文件中去定义分片与副本数量
# 生产环境中一般设置10个分片和2个副本
# 注意: 副本数量不能大于集群的数量
[root@elk188 ~]$ cp /etc/filebeat/config/07-log-to-es.yml /etc/filebeat/config/08-log-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/08-log-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/08-log-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-linux-elk-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "longchi-linux80"
    - index: "longchi-linux-python-%{+yyyy.MM.dd}"
      when.contains:
        tags: "longchi-python"



# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板
setup.template.overwrite: false
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-2(本集群),副本数量要求小于集群数量
  index.number_of_replicas: 1


重新启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/08-log-to-es.yml


# 创建模板
(kibana控制面板先删除索引管理->索引和索引模板再启动filebeat实例重新创建索引和模板)
2024-10-17T02:25:53.757-0700    INFO    template/load.go:131    Try loading template longchi-linux to Elasticsearch
2024-10-17T02:25:53.971-0700    INFO    template/load.go:123    Template with name "longchi-linux" loaded.


备注:
1. 集群的颜色
Red: 集群的部分主分片无法访问
Yellow: 集群的部分副本分片无法访问
Green: 集群的主分片和副本分片可以访问

2. 集群的主分片和副本分片的区别
(1) 主分片可以读写, 即rw
(2) 副本分片只能读,即ro

3. filebeat 的两大组件 input,output
filebeat 的作用是数据采集和数据传输
filebeat 的工作原理 是按行读取

4. Elasticsearch (简称 ES  主要作用做数据的存储,数据的查询,数据的分析)Rest API
索引: index-->数据的逻辑存储名称
分片:shard--> 一个索引至少有一个或多个分片,分片是我们索引真实存储地,他是真正的数据存储,每一个分片就是负责真正存储的
副本:replica是对分片的一个备份,一个分片至少有0个或多个副本,如果没有副本,该节点挂了,你在其他节点就找不到他的数据

5,kibana (数据展示)
建立索引模式--->ES上的索引
创建索引模式时至少要匹配一个或多个索引
systemctl enable elasticsearch --now
systemctl enable kibana --now

9)nginx 实例
[root@elk188 ~]$ cp /etc/filebeat/config/08-log-to-es.yml /etc/filebeat/config/09-nginx-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/09-nginx-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/09-nginx-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
  # 给当前的输入类型打上标签
  tags: ["access"]



output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-nginx-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 1


启动 filebeat 的 nginx 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/09-nginx-to-es.yml




10)基于log类型收集nginx的json日志
修改 nginx 配置文件
[root@elk188 ~]$ cat /etc/nginx/nginx.conf
...
  log_format longchi_nginx_json '{"@timestamp": "$time_iso8601",'
                          '"host": "$server_addr",'
                          '"clientip": "$remote_addr",'
                          '"size": "$body_bytes_sent",'
                          '"responsetime": "$request_time",'
                          '"upstreamtime": "$upstream_response_time",'
                          '"upstreamhost": "$upstream_addr",'
                          '"http_host": "$host",'
                          '"uri": "$uri",'
                          '"domain": "$host",'
                          '"xff": "$http_x_forwarded_for",'
                          '"referer": "$http_referer",'
                          '"tcp_xff": "$proxy_protocol_addr",'
                          '"http_user_agent": "$http_user_agent",'
                          '"status": "$status"}';

    access_log /var/log/nginx/access.log longchi_nginx_json;
修改filebeat 启动配置文件
[root@elk188 ~]$ cat /etc/filebeat/config/10-nginx-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
  # 给当前的输入类型打上标签
  tags: ["access"]
  parsers:
    - ndjson:
      json.keys_under_root: true
      json.overwrite_keys: true
      json.add_error_key: true
      json.message_key: true




# 字符行是json格式,如下配置
# json 所有的key 是否在顶级key(json)下
#  json.keys_under_root: true
# 如果外部存在key,是否覆盖
#  json.overwrite_keys: true
# 是否添加错误key,如解析出错,会添加解析错误信息
#  json.add_error_key: true
# 添加message 的key
#  json.message_key: log



output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-nginx-access-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 1



11)
补充知识点-索引和分片
# 分片是真正存储数据空间的,分片里面存放不同的文档,文档里面存放索引即文档是真正存储数据的地方 (分片里面对应一个lucene索引即lucene索引里面对应的是一个分片,他主要是一个搜索框架库,缺点:就是单节点访问,ES底层用的是lucene索引)
# 如何利用ES集群呢?可以设置多个分片,ES集群的分片一般设置为10,一般大厂(腾讯)都是这样设置,1G对应20个分片数,假设你服务器有32G,对应的是640个分片,一个节点有640个分片应该差不多了。
# 如何定义分片?这个就会涉及到一个路由计算,他是根据文档ID去进行hash计算的,文档的ID是他的唯一标识,让他的值除以集群数(主分片数),取余得到的值就是该分片存放文档的节点主机
"_id": "RAdbmJIBJmKm3sgs4J3G",
路由计算: hash(_id)%primary shard number=分片编号
缺点: 数据存在单点故障,当该节点挂掉后,我们可以通过副本去其他节点拿到数据
解决方案:准备副本 3分片一副本(每个节点都对应一个分片,3个节点就是3个分片,每个分片对应一个副本)如下图所示
注意: 生产环境中不能修改副本,不可以扩容,分片数量配置后是不可以修改的,副本数配置后可以修改吗?可以修改

# 9200端口遵循http,https协议(外部通信),9300端口遵循tcp协议(内部通信)
# 过滤 kibana 配置文件  kibana也是作为ES集群的客户端  用户可以直接操作API的
[root@elk188 ~]$ egrep -v "^#|^$" /etc/kibana/kibana.yml
server.host: "0.0.0.0"
server.name: "longchi-elk"
elasticsearch.hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
i18n.locale: "zh-CN"
[root@elk188 ~]$ cat /etc/filebeat/config/07-log-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-linux-elk-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "longchi-linux80"
    - index: "longchi-linux-python-%{+yyyy.MM.dd}"
      when.contains:
        tags: "longchi-python"



# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
如图集群配置2个副本分片必须分别放在2个不同节点(副本不可以放在自己主机上,要放在别的主机上)这样可以确保即使该节点挂掉,也可以从其他节点拿数据。
当一个机柜断电的时候可以去第二个机柜去拿数据
EFK架构数据流走向
6, 执行以下命令可以看到自定义字段
rm -rf /var/lib/filebeat/*
filebeat -e -c config/04-log-to-console.yml

[root@elk188 ~]$ cat config/04-log-to-console.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  tags: ["longchi-linux","容器运维","DBA运维","SRE运维工程师"]
  fields:
    school: "北京昌平区沙河镇"
    class: "linux80"


- type: log
  enabled: true
  paths:
    - /tmp/test/*/*.log
  tags: ["longchi-python","云原生运维"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

output.console:
  pretty: true

执行以下命令可以看到自定义字段
rm -rf /var/lib/filebeat/*
filebeat -e -c config/04-log-to-console.yml
{
  "@timestamp": "2024-10-15T22:09:33.259Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.3"
  },
  "agent": {
    "type": "filebeat",
    "version": "7.17.3",
    "hostname": "elk188.longchi.xyz",
    "ephemeral_id": "37eb1a3a-f9cd-4edd-9da6-3ab34f5c7819",
    "id": "e66573c4-284e-46cd-8875-94f280168bcf",
    "name": "elk188.longchi.xyz"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": "/tmp/test.log"
    }
  },
  "message": "1111",
  "tags": [
    "longchi-linux",
    "容器运维",
    "DBA运维",
    "SRE运维工程师"
  ],
  "input": {
    "type": "log"
  },
  "fields": {
    "class": "linux80",
    "school": "北京昌平区沙河镇"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk188.longchi.xyz"
  }
}
{
  "@timestamp": "2024-10-15T22:09:33.259Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.3"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": "/tmp/test/elk/1.log"
    }
  },
  "message": "2222",
  "tags": [
    "longchi-python",
    "云原生运维"
  ],
  "input": {
    "type": "log"
  },
  "corporation": "上海隆迟实业有限公司",
  "address": "上海市奉贤区奉城镇新奉公路2011号1幢1243室",
  "agent": {
    "hostname": "elk188.longchi.xyz",
    "ephemeral_id": "37eb1a3a-f9cd-4edd-9da6-3ab34f5c7819",
    "id": "e66573c4-284e-46cd-8875-94f280168bcf",
    "name": "elk188.longchi.xyz",
    "type": "filebeat",
    "version": "7.17.3"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk188.longchi.xyz"
  }
}
7, 启动 filebeat 实例
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c /etc/filebeat/config/06-log-to-es.yml

ES

# inputs 输入文档配置地址
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html

# output 输出文档配置地址
https://www.elastic.co/guide/en/beats/filebeat/current/console-output.html

# output 输出 elasticsearch 配置文档地址
https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html

# 索引配置模板地址
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-template.html

# 索引生命周期地址:
https://www.elastic.co/guide/en/beats/filebeat/7.17/ilm.html



# 
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html

# nginx module的文档地址
https://www.elastic.co/guide/en/beats/filebeat/7.17/filebeat-module-nginx.html

# tomcat module 的文档地址
https://www.elastic.co/guide/en/beats/filebeat/7.17/filebeat-module-tomcat.html

# filestream 类型的多行匹配
https://www.elastic.co/guide/en/beats/filebeat/7.17/multiline-examples.html

# filebeat input中的tcp文档地址
https://www.elastic.co/guide/en/beats/filebeat/7.17/filebeat-input-tcp.html

# filebeat output的文件地址
https://www.elastic.co/guide/en/beats/filebeat/7.17/file-output.html


# logstash的elasticsearch 输出 文档地址
https://www.elastic.co/guide/en/logstash/7.17/plugins-outputs-elasticsearch.html

八,filebeat企业常见案例(EFK架构)

1,使用filebeat收集nginx日志到es集群

(1) 安装nginx服务并启动
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enable=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

yum -y install nginx
systemctl start nginx
systemctl cat nginx
systemctl enable nginx
systemctl status nginx

(2) 配置 filebeat 收集 nginx 日志并写入到ES
cat > /etc/filebeat/config/02-filestream-to-console.yml << 'EOF'
filebeat.inputs:
- type: filestream
  # 指定收集访问日志的路径
  paths:
    - /var/log/nginx/access.log
    
out.elasticsearch:
  # 指定ES集群的列表
  hosts:
    - "http://192.168.222.187:9200"
    - "http://192.168.222.188:9200"
    - "http://192.168.222.189:9200"
EOF

(3)启动 filebeat 实例
filebeat -e -c /etc/filebeat/config/02-filestreat-to-console.yml

(4) 通过 kibana 查看日志

2,基于 log类型收集 nginx 原生日志

[root@elk188 ~]$ vim /etc/filebeat/config/09-nginx-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/09-nginx-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
  # 给当前的输入类型打上标签
  tags: ["access"]



output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-nginx-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 1


启动 filebeat 的 nginx 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/09-nginx-to-es.yml

3,基于log类型收集 nginx 的 json 日志

(1) 修改 nginx 的源日志格式
vim /etc/nginx/nginx.conf
...
    log_format longchi_nginx_json '{"@timestamp":"$time_iso8601",'
                        '"@source":"$server_addr",'
                        '"idc":"huzhou",'
                        '"http_cookie":"$http_cookie",'
                        '"hostname":"$hostname",'
                        '"ip":"$http_x_forwarded_for",'
                        '"client":"$remote_addr",'
                        '"request_method":"$request_method",'
                        '"scheme":"$scheme",'
                        '"domain":"$server_name",'
                        '"referer":"$http_referer",'
                        '"request":"$request_uri",'
                        '"args":"$args",'
                        '"size":$body_bytes_sent,'
                        '"request_body":"$request_body",'
                        '"status": $status,'
                        '"responsetime":$request_time,'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamaddr":"$upstream_addr",'
                        '"http_user_agent":"$http_user_agent",'
                        '"https":"$https"'
                        '}';



    access_log /var/log/nginx/access.log longchi_nginx_json;



   
(2) 检查 nginx 的配置文件语法并重启 nginx 服务
nginx -t
systemctl restart nginx

(3) nginx的配置文件
[root@elk188 ~]$ cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';

#    access_log  /var/log/nginx/access.log  main;



    log_format longchi_nginx_json '{"@timestamp":"$time_iso8601",'
                        '"@source":"$server_addr",'
                        '"idc":"huzhou",'
                        '"http_cookie":"$http_cookie",'
                        '"hostname":"$hostname",'
                        '"ip":"$http_x_forwarded_for",'
                        '"client":"$remote_addr",'
                        '"request_method":"$request_method",'
                        '"scheme":"$scheme",'
                        '"domain":"$server_name",'
                        '"referer":"$http_referer",'
                        '"request":"$request_uri",'
                        '"args":"$args",'
                        '"size":$body_bytes_sent,'
                        '"request_body":"$request_body",'
                        '"status": $status,'
                        '"responsetime":$request_time,'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamaddr":"$upstream_addr",'
                        '"http_user_agent":"$http_user_agent",'
                        '"https":"$https"'
                        '}';



    access_log /var/log/nginx/access.log longchi_nginx_json;




    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
4, 基于模块采集 nginx 日志文件
[root@elk188 ~]$ cat /etc/filebeat/config/11-nginx-to-es.yml
# encoding: utf-8
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  # 开启热加载功能
  reload.enabled: true


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-nginx-access-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0
5,基于模块采集 tomcat 日志文件
(1) 部署 tomcat 服务 
1) 解压 tomcat 软件包

tar xf apache-tomcat-10.0.20.tar.gz -C /longchi/softwares/


2) 创建符号链接
cd /longchi/softwares/ && ln -sv apache-tomcat-10.0.20 tomcat

3) 配置环境变量
vim /etc/profile.d/elk.sh
...
# export JAVA_HOME=/usr/share/elasticsearch/jdk

export JAVA_HOME=/longchi/softwares/jdk
export TOMCAT_HOME=/longchi/softwares/tomcat
export PATH=$PATH:$TOMCAT_HOME/bin:$JAVA_HOME/bin



4) 使得环境变量生效
source /etc/profile.d/elk.sh

5) 启动 tomcat 服务
catalina.sh start

6) 停止 tomcat 服务
catalina.sh stop

(2) 启用 tomcat 的模块管理  配置收集采集日志
filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules disable nginx
filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules enable tomcat
1)启用tomcat可以用如下两个命令
[root@elk188 ~]$ mv /etc/filebeat/modules.d/tomcat.yml.disabled /etc/filebeat/modules.d/tomcat.yml

[root@elk188 ~]$ filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules enable tomcat
#查看启用的命令
[root@elk188 ~]$ filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules list | head


[root@elk188 ~]$ filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules disable nginx
Disabled nginx
[root@elk188 ~]$ filebeat -c /etc/filebeat/config/11-nginx-to-es.yml modules list | head
Enabled:
tomcat

Disabled:
activemq
apache
[root@elk188 ~]$ cp /etc/filebeat/config/11-nginx-to-es.yml /etc/filebeat/config/12-tomcat-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/12-tomcat-to-es.yml
# encoding: utf-8
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  # 开启热加载功能
  reload.enabled: true


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-tomcat-access-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


[root@elk188 ~]$ ll /etc/filebeat/modules.d/*.yml
-rw-r--r-- 1 root root 623 Apr 19  2022 /etc/filebeat/modules.d/tomcat.yml

修改 tomcat 配置文件
[root@elk188 ~]$ vim /etc/filebeat/modules.d/tomcat.yml
[root@elk188 ~]$ egrep -v "^*#|^$" /etc/filebeat/modules.d/tomcat.yml
- module: tomcat
  log:
    enabled: true
    var.input: file
    var.paths:
      - "/longchi/softwares/apache-tomcat-10.0.20/logs/localhost_access_log.2024-10-19.txt"
6, 基于 log 类型收集tomcat的原生日志
[root@elk188 ~]$ cp /etc/filebeat/config/12-tomcat-to-es.yml /etc/filebeat/config/13-tomcat-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/13-tomcat-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/13-tomcat-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  # 开启热加载
  reload.enabled: true

output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-tomcat-access-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0

启动 filebeat 的tomcat原生日志 实例
[root@elk188 ~]$ rm -rf /var/lib/filebeat/*
[root@elk188 ~]$ filebeat -e -c /etc/filebeat/config/13-tomcat-to-es.yml
7,基于 log 类型收集 tomcat 的 json 日志
# 备份配置文件
[root@elk188 ~]$ cp /longchi/softwares/apache-tomcat-10.0.20/conf/{server.xml,server.xml-`date +%F`}
[root@elk188 ~]$ ll /longchi/softwares/apache-tomcat-10.0.20/conf/server.xml*
-rw------- 1 root root 6757 Oct 20 01:28 /longchi/softwares/apache-tomcat-10.0.20/conf/server.xml
-rw------- 1 root root 6757 Oct 20 01:29 /longchi/softwares/apache-tomcat-10.0.20/conf/server.xml-2024-10-20

1) 修改配置文件
vim /longchi/softwares/apache-tomcat-10.0.20/conf/server.xml
将 <Host></Host>中的内容替换为如下内容
 <Host name="tomcat.longchi.xyz"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="tomcat.longchi.xyz_access_log" suffix=".txt"
               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;}"/>

      </Host>

2) 修改 filebesat 的配置文件如下
[root@elk188 ~]$ cp /etc/filebeat/config/13-tomcat-to-es.yml /etc/filebeat/config/14-tomcat-to-es.yml

[root@elk188 ~]$ cat /etc/filebeat/config/14-tomcat-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  json.keys_under_root: true
  # 开启热加载
  reload.enabled: true


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-tomcat-access-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0

3) 修改主机名
[root@elk187 ~]$ vim /etc/hosts
[root@elk187 ~]$ data_rsync.sh /etc/hosts
===== rsyncing elk188.longchi.xyz: hosts =====
命令执行成功
===== rsyncing elk189.longchi.xyz: hosts =====
命令执行成功
[root@elk187 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.222.187 elk187.longchi.xyz
192.168.222.188 elk188.longchi.xyz tomcat.longchi.xyz
192.168.222.189 elk189.longchi.xyz


4)访问tomcat服务
[root@elk187 ~]$ curl -I tomcat.longchi.xyz:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 21 Oct 2024 10:46:17 GMT

[root@elk187 ~]$ curl tomcat.longchi.xyz:8080
[root@elk188 /longchi/softwares/apache-tomcat-10.0.20/logs]$ ll
total 20
-rw-r----- 1 root root 6976 Oct 21 03:43 catalina.2024-10-21.log
-rw-r----- 1 root root 6976 Oct 21 03:43 catalina.out
-rw-r----- 1 root root  696 Oct 21 03:49 tomcat.longchi.xyz_access_log.2024-10-21.txt



# 同步脚本文件
[root@elk187 ~]$ cat data_rsync.sh
#!/bin/bash
#Auther: zengguoqing
#encoding: utf-8

if [ $# -ne 1 ];then
    echo "Usage: $0 /path/to/file"
    exit
fi

# 判断文件是否存在
if [ ! -e $1 ];then
    echo "[ $1 ] dir or file not find"
    exit
fi


#获取父路径
fullpath=`dirname $1`

#获取子路径
basename=`basename $1`

#进入父路径
cd $fullpath

for ((host_id=188;host_id<=189;host_id++))
  do
    # 使得终端输出变为绿色
    tput setaf 2
    echo ===== rsyncing elk${host_id}.longchi.xyz: $basename =====
    # 使得终端恢复原来的颜色
    tput setaf 7
    # 将数据同步到其他两个节点
    rsync -az $basename `whoami`@elk${host_id}.longchi.xyz:$fullpath
    if [ $? -eq 0 ];then
      echo "命令执行成功"
    fi
done



启动 filebeat 的 tomcat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/14-tomcat-to-es.yml



KQL(Kibana Query Language)语言
status : "200" and clientip:"192.168.222.189"  点击更新,就可以看到结果
8,多行匹配-收集tomcat错误日志
[root@elk188 ~]$ cp /etc/filebeat/config/14-tomcat-to-es.yml /etc/filebeat/config/15-tomcat-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/15-tomcat-to-es.yml
[root@elk188 /longchi/softwares/apache-tomcat-10.0.20/logs]$ vim /etc/filebeat/config/15-tomcat-to-es.yml
[root@elk188 /longchi/softwares/apache-tomcat-10.0.20/logs]$ cat /etc/filebeat/config/15-tomcat-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: false # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  json.keys_under_root: true
  # 开启热加载
  reload.enabled: true

- type: log
  enabled: true
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.out
  # 指定多行匹配的类型,可选值为"pattern",还有一个 "count"
  multiline.type: pattern
  # 指定匹配模式
  multiline.pattern: '^\d{2}'
  # 下面参数参考官方文档即可
  multiline.negate: true
  multiline.match: after


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-tomcat-error-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/15-tomcat-to-es.yml
9,多行匹配-收集 elasticsearch 的错误日志
1) elasticsearch 日志
[root@elk188 ~]$ ll /var/log/elasticsearch/longchi-elk.log
-rw-r--r-- 1 elasticsearch elasticsearch 3872898 Oct 21 17:00 /var/log/elasticsearch/longchi-elk.log

2) 查看日志
[root@elk188 ~]$ tail -100f /var/log/elasticsearch/longchi-elk.log


3) 查看 elasticsearch 服务自启动文件
[root@elk188 ~]$ systemctl cat elasticsearch
# /usr/lib/systemd/system/elasticsearch.service
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
Type=notify
RuntimeDirectory=elasticsearch
PrivateTmp=true
Environment=ES_HOME=/usr/share/elasticsearch
Environment=ES_PATH_CONF=/etc/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
Environment=ES_SD_NOTIFY=true
EnvironmentFile=-/etc/sysconfig/elasticsearch

WorkingDirectory=/usr/share/elasticsearch

User=elasticsearch
Group=elasticsearch

ExecStart=/usr/share/elasticsearch/bin/systemd-entrypoint -p ${PID_DIR}/elasticsearch.pid --quiet

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65535

# Specifies the maximum number of processes
LimitNPROC=4096

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

# Allow a slow startup before the systemd notifier module kicks in to extend the timeout
TimeoutStartSec=75

[Install]
WantedBy=multi-user.target

# Built for packages-7.17.3 (packages)



4) 查看启动文件是一个文本文件,是可以打开的
[root@elk188 ~]$ file /usr/share/elasticsearch/bin/systemd-entrypoint
/usr/share/elasticsearch/bin/systemd-entrypoint: POSIX shell script, ASCII text executable
[root@elk188 ~]$ cat /usr/share/elasticsearch/bin/systemd-entrypoint
#!/bin/sh

# This wrapper script allows SystemD to feed a file containing a passphrase into
# the main Elasticsearch startup script

if [ -n "$ES_KEYSTORE_PASSPHRASE_FILE" ] ; then
  exec /usr/share/elasticsearch/bin/elasticsearch "$@" < "$ES_KEYSTORE_PASSPHRASE_FILE"
else
  exec /usr/share/elasticsearch/bin/elasticsearch "$@"
fi


5) 创建错误日志
[root@elk188 ~]$ /usr/share/elasticsearch/bin/elasticsearch
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
Future versions of Elasticsearch will require Java 11; your Java version from [/longchi/softwares/jdk1.8.0_321/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
Future versions of Elasticsearch will require Java 11; your Java version from [/longchi/softwares/jdk1.8.0_321/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
[2024-10-21T22:38:00,621][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [elk188.longchi.xyz] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.3.jar:7.17.3]
        at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.3.jar:7.17.3]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:107) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:183) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.3.jar:7.17.3]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166) ~[elasticsearch-7.17.3.jar:7.17.3]
        ... 6 more
uncaught exception in thread [main]
java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:107)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:183)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
For complete error details, refer to the log at /var/log/elasticsearch/longchi-elk.log
2024-10-22 05:38:01,058610 UTC [7634] INFO  Main.cc@111 Parent process died - ML controller exiting


6)修改 filebeat 的配置文件
[root@elk188 ~]$ cp /etc/filebeat/config/15-tomcat-to-es.yml /etc/filebeat/config/16-tomcat-to-es.yml                                                      [root@elk188 ~]$ vim /etc/filebeat/config/16-tomcat-to-es.yml
[root@elk188 ~]$ mv /etc/filebeat/config/16-tomcat-to-es.yml /etc/filebeat/config/16-eslog-to-es.yml                                                       [root@elk188 ~]$ vim /etc/filebeat/config/16-eslog-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/16-eslog-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: false # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  json.keys_under_root: true
  # 开启热加载
  reload.enabled: true

- type: log
  enabled: true
  paths:
    - /var/log/elasticsearch/longchi-elk.log*
  # 指定多行匹配的类型,可选值为"pattern",还有一个 "count"
  multiline.type: pattern
  # 指定匹配模式
  multiline.pattern: '^\['
  # 下面参数参考官方文档即可
  multiline.negate: true
  multiline.match: after


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-es-error-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0



7) 启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/16-eslog-to-es.yml
10,日志过滤 可以指定黑白名单且都支持通配符
[root@elk188 ~]$ cp /etc/filebeat/config/04-log-to-console.yml /etc/filebeat/config/17-log-to-console.yml
[root@elk188 ~]$ vim /etc/filebeat/config/17-log-to-console.yml
[root@elk188 ~]$ filebeat -e -c /etc/filebeat/config/17-log-to-console.yml

[root@elk188 /tmp/test]$ echo 1111 > test.log
[root@elk188 /tmp/test]$ vim /etc/filebeat/config/17-log-to-console.yml
[root@elk188 /tmp/test]$ echo 2222 >> test.log

[root@elk188 ~]$ ll /tmp/test/test.log
-rw-r--r-- 1 root root 10 Oct 22 00:59 /tmp/test/test.log
[root@elk188 ~]$ echo 3333 >> /tmp/test/test.log
[root@elk188 ~]$ ll /tmp/test/test.log
-rw-r--r-- 1 root root 15 Oct 22 01:10 /tmp/test/test.log
[root@elk188 ~]$ cat /var/lib/filebeat/registry/filebeat/log.json
{"op":"set","id":1}



[root@elk188 /tmp/test]$ cat /etc/filebeat/config/17-log-to-console.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: false # 启用或禁用
  # 指定数据路径
  paths:
    - /tmp/test.log
    - /tmp/*.txt
  # 给当前的输入类型打上标签
  tags: ["longchi-linux80","容器运维","DBA运维","SRE运维工程师"]
  # 自定义字段
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
  # 将该字段设置为顶级字段
  # 将自定义字段的 key-value 放到顶级字段
  # 默认值为false,会将数据放在一个叫"fields"的字段下面
  fields_under_root: true

- type: log
  enabled: true
  paths:
    - /tmp/test/*.log
  # 包含指定内容才会采集,且区分大小写,指定白名单,支持通配符
  # include_lines: ['^ERR', '^WARN',"longchi"]
  # 指定排除的内容,指定黑名单
  exclude_lines: ['^DBG',"linux"]
  tags: ["longchi-python","云原生开发"]
  fields:
    corporation: "上海隆迟实业有限公司"
    address: "上海市奉贤区奉城镇新奉公路2011号1幢1243室"
    name: "longchi"
    domain_name: "longchi.xyz"


output.console:
  pretty: true


启动 filebeat 实例
filebeat -e -c /etc/filebeat/config/17-log-to-console.yml

# 过滤日志
# 过滤关键字 'when'
[root@elk188 ~]$ grep when /etc/filebeat/config/*.yml
/etc/filebeat/config/07-log-to-es.yml:      when.contains:
/etc/filebeat/config/07-log-to-es.yml:      when.contains:
/etc/filebeat/config/08-log-to-es.yml:      when.contains:
/etc/filebeat/config/08-log-to-es.yml:      when.contains:

# 
[root@elk188 ~]$ cp /etc/filebeat/config/08-log-to-es.yml /etc/filebeat/config/18-nginx-to-es.yml                                 


[root@elk188 /var/log/nginx]$ vim /etc/filebeat/config/18-nginx-to-es.yml
[root@elk188 /var/log/nginx]$ cat /etc/filebeat/config/18-nginx-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
    -
  # 给当前的输入类型打上标签
  tags: ["access"]
  # 解析 message 字段的json格式,并放在顶级字段中
  json.keys_under_root: true


- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/error.log*
  tags: ["error"]
  include_lines: ["error"]

output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-linux-web-nginx-access-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "access"
    - index: "longchi-linux-web-nginx-error-%{+yyyy.MM.dd}"
      when.contains:
        tags: "error"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板
setup.template.overwrite: false
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0



修改nginx配置文件 json格式
[root@elk188 /var/log/nginx]$ vim /etc/nginx/nginx.conf
[root@elk188 /var/log/nginx]$ cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';
#
#    access_log  /var/log/nginx/access.log  main;


    log_format longchi_nginx_json '{"@timestamp": "$time_iso8601",'
                          '"host": "$server_addr",'
                          '"clientip": "$remote_addr",'
                          '"size": "$body_bytes_sent",'
                          '"responsetime": "$request_time",'
                          '"upstreamtime": "$upstream_response_time",'
                          '"upstreamhost": "$upstream_addr",'
                          '"http_host": "$host",'
                          '"uri": "$uri",'
                          '"domain": "$host",'
                          '"xff": "$http_x_forwarded_for",'
                          '"referer": "$http_referer",'
                          '"tcp_xff": "$proxy_protocol_addr",'
                          '"http_user_agent": "$http_user_agent",'
                          '"status": "$status"}';

    access_log /var/log/nginx/access.log longchi_nginx_json;


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@elk188 /var/log/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@elk188 /var/log/nginx]$ systemctl restart nginx


[root@elk188 /var/log/nginx]$ cat access.log
{"@timestamp": "2024-10-22T04:40:51-07:00","host": "127.0.0.1","clientip": "127.0.0.1","size": "615","responsetime": "0.000","upstreamtime": "-","upstreamhost": "-","http_host": "127.0.0.1","uri": "/index.html","domain": "127.0.0.1","xff": "-","referer": "-","tcp_xff": "-","http_user_agent": "curl/7.29.0","status": "200"}




启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/18-nginx-to-es.yml
11,nginx 和 tomcat 同时采集案例
1) 编写 filebeat 的web配置文件
[root@elk188 ~]$ cp /etc/filebeat/config/18-nginx-to-es.yml /etc/filebeat/config/19-web-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/19-web-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/19-web-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
    -
  # 给当前的输入类型打上标签
  tags: ["nginx-access"]
  # 解析 message 字段的json格式,并放在顶级字段中
  json.keys_under_root: true


- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/error.log*
  tags: ["nginx-error"]
  include_lines: ["error"]

- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true   # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  json.keys_under_root: true
  # 开启热加载
  # reload.enabled: true
  tags: ["tomcat-access"]

- type: log
  enabled: true
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.out
  # 指定多行匹配的类型,可选值为"pattern",还有一个 "count"
  multiline.type: pattern
  # 指定匹配模式
  multiline.pattern: '^\d{2}'
  # 下面参数参考官方文档即可
  multiline.negate: true
  multiline.match: after
  tags: ["tomcat-error"]


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-linux-web-nginx-access-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "nginx-access"
    - index: "longchi-linux-web-nginx-error-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-error"
    - index: "longchi-linux-web-tomcat-access-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "tomcat-access"
    - index: "longchi-linux-web-tomcat-error-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-error"



# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板
setup.template.overwrite: false
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0

2)修改 nginx 配置文件 即将nginx输出的access.log原日志替换为如下的json格式
vim /etc/nginx/nginx.cong
...
   log_format longchi_nginx_json '{"@timestamp": "$time_iso8601",'
                          '"host": "$server_addr",'
                          '"clientip": "$remote_addr",'
                          '"size": "$body_bytes_sent",'
                          '"responsetime": "$request_time",'
                          '"upstreamtime": "$upstream_response_time",'
                          '"upstreamhost": "$upstream_addr",'
                          '"http_host": "$host",'
                          '"uri": "$uri",'
                          '"domain": "$host",'
                          '"xff": "$http_x_forwarded_for",'
                          '"referer": "$http_referer",'
                          '"tcp_xff": "$proxy_protocol_addr",'
                          '"http_user_agent": "$http_user_agent",'
                          '"status": "$status"}';

    access_log /var/log/nginx/access.log longchi_nginx_json;


3) 修改 tomcat 配置文件将原<Host></Host>替换为如下内容
 <Host name="tomcat.longchi.xyz"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="tomcat.longchi.xyz_access_log" suffix=".txt"
               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;}"/>

      </Host>


4) 启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/19-web-to-es.yml
12,input 插件 filestream 类型案例
[root@elk188 ~]$ cp /etc/filebeat/config/09-nginx-to-es.yml /etc/filebeat/config/20-nginx-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/20-nginx-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/20-nginx-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: filestream
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/nginx/access.log*
  # 给当前的输入类型打上标签
  tags: ["access"]
  # 对于 filestream 类型,不能使用'json.keys_under_root' 需要配置 parses 解析器
  # json.keys_under_root: true
  # 终上所述我们需要配置如下解析器来实现 json 解析
  parsers:
    - ndjson:
        keys_under_root: true


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-linux-nginx-%{+yyyy.MM.dd}"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


2)修改 nginx 配置文件 即将nginx输出的access.log原日志替换为如下的json格式
vim /etc/nginx/nginx.cong
...
   log_format longchi_nginx_json '{"@timestamp": "$time_iso8601",'
                          '"host": "$server_addr",'
                          '"clientip": "$remote_addr",'
                          '"size": "$body_bytes_sent",'
                          '"responsetime": "$request_time",'
                          '"upstreamtime": "$upstream_response_time",'
                          '"upstreamhost": "$upstream_addr",'
                          '"http_host": "$host",'
                          '"uri": "$uri",'
                          '"domain": "$host",'
                          '"xff": "$http_x_forwarded_for",'
                          '"referer": "$http_referer",'
                          '"tcp_xff": "$proxy_protocol_addr",'
                          '"http_user_agent": "$http_user_agent",'
                          '"status": "$status"}';

    access_log /var/log/nginx/access.log longchi_nginx_json;


3)启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/20-nginx-to-es.yml
13,filestream 类型多行匹配
(1) 编写 filebeat 配置文件
cat > /etc/filebeat/config/08-tomcat-error-to-es.yml < 'EOF'
filebeat.inputs:
- type: filestream
  paths: 
    - /longchi/softwares/tomcat/logs/catalina.out
  parsers:
    - multiline:
        type: pattern
        pattern: '^\d{2}'
        negate: true
        match: after
        
        
output.elasticsearch:
  hosts:
    - "http://10.0.0.101:9200"
    - "http://10.0.0.102:9200"
    - "http://10.0.0.103:9200"
  index: "longchi-tomcat-error-%{+yyyy.MM.dd}"  


setup.ilm.enabled: false
setup.template.name: "longchi-tomcat-error"
setup.template.pattern: "longchi-tomcat-error*"
setup.template.overwrite: true
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0
EOF

(2) 启动 filebeat 实例
filebeat test config -c /etc/filebeat/config/08-tomcat-error-to-es.yml
filebeat -e -c /etc/filebeat/config/08-tomcat-error-to-es.yml


--------------------
[root@elk188 ~]$ cp /etc/filebeat/config/20-nginx-to-es.yml /etc/filebeat/config/21-tomcat-to-es.yml                                 [root@elk188 ~]$ vim /etc/filebeat/config/21-tomcat-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/21-tomcat-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: filestream
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.txt
  # 给当前的输入类型打上标签
  tags: ["tomcat-access"]
  # 对于 filestream 类型,不能使用'json.keys_under_root' 需要配置 parses 解析器
  # json.keys_under_root: true
  # 终上所述我们需要配置如下解析器来实现 json 解析
  parsers:
    - ndjson:
        keys_under_root: true

- type: filestream
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /longchi/softwares/apache-tomcat-10.0.20/logs/*.out
  # 给当前的输入类型打上标签
  tags: ["tomcat-error"]
  parsers:
    - multiline:
        type: pattern
        pattern: '^\d{2}'
        negate: true
        match: after


  #multiline.type: pattern
  #multiline.pattern: '^\d{2}'
  #multiline.negate: true
  #multiline.match: after


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  indices:
    - index: "longchi-linux-web-tomcat-access-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "tomcat-access"
    - index: "longchi-linux-web-tomcat-error-%{+yyyy.MM.dd}"
      when.contains:
        tags: "tomcat-error"



# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
setup.template.name: "longchi-linux"
# 设置索引模板的匹配模式
setup.template.pattern: "longchi-linux*"
# 覆盖已有的索引模板,如果为true,则会直接覆盖现有的索引模板,如果为false,则不会覆盖
setup.template.overwrite: true
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 3
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/21-tomcat-to-es.yml
14, 收集 系统 日志
# 收集 spooler maillog secure boot.log yum.log firewalld messages cron的日志,要求如下:
(1) 在同一个filebeat配置文件中书写
(2) 将上述8类日志分别写入不同的索引,索引前缀名称为 "longchi-elk-system-log-{xxx}-%{+yyyy.MM.dd}"
(3) 要求副本数量为0,分片数量为10

1,书写filebeat配置文件
[root@elk188 ~]$ cp /etc/filebeat/config/19-web-to-es.yml /etc/filebeat/config/22-system-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/22-system-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/22-system-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/spooler
  # 给当前的输入类型打上标签
  tags: ["spooler"]
  # 解析 message 字段的json格式,并放在顶级字段中
  # json.keys_under_root: true


- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/maillog
  tags: ["maillog"]
  # include_lines: ["error"]

- type: log
  # 是否启动当前的输入类型,默认值为 true
  enabled: true   # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/secure
  # json.keys_under_root: true
  # 开启热加载
  # reload.enabled: true
  tags: ["secure"]

- type: log
  enabled: true
  paths:
    - /var/log/boot.log
  # 指定多行匹配的类型,可选值为"pattern",还有一个 "count"
  # multiline.type: pattern
  # 指定匹配模式
  # multiline.pattern: '^\d{2}'
  # 下面参数参考官方文档即可
  # multiline.negate: true
  # multiline.match: after
  tags: ["boot"]

- type: log
  enabled: true
  paths:
    - /var/log/yum.log
  tags: ["yum"]


- type: log
  enabled: true
  paths:
    - /var/log/firewalld
  tags: ["firewalld"]


- type: log
  enabled: true
  paths:
    - /var/log/messages
  tags: ["messages"]


- type: log
  enabled: true
  paths:
    - /var/log/cron
  tags: ["cron"]


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-linux-elk-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-elk-system-log-spooler-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "spooler"
    - index: "longchi-elk-system-log-maillog-%{+yyyy.MM.dd}"
      when.contains:
        tags: "maillog"
    - index: "longchi-elk-system-log-secure-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "secure"
    - index: "longchi-elk-system-log-boot-%{+yyyy.MM.dd}"
      when.contains:
        tags: "boot"

    - index: "longchi-elk-system-log-yum-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "yum"
    - index: "longchi-elk-system-log-firewalld-%{+yyyy.MM.dd}"
      when.contains:
        tags: "firewalld"
    - index: "longchi-elk-system-log-messages-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "messages"
    - index: "longchi-elk-system-log-cron-%{+yyyy.MM.dd}"
      when.contains:
        tags: "cron"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
# setup.template.name: "longchi-linux"
setup.template.name: "longchi-elk-system"
# 设置索引模板的匹配模式
# setup.template.pattern: "longchi-linux*"
setup.template.pattern: "longchi-elk-system*"
# 覆盖已有的索引模板
setup.template.overwrite: false
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 10
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


2,启动 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/22-system-to-es.yml

注意: 当filebeat系统日志分多个配置文件实现,需要在启动文件后面添加 '--path.data /var/lib/filebeat/' 数据存储目录路径比如:
filebeat -e -c /etc/filebeat/config/22-system-to-es.yml --path.data /var/lib/filebeat/

7.17.3 版本可能遇到的问题:
(1) input源配置一旦超过4个,写入ES时,就可能会复现出部分数据无法写入的问题;
有两种解决方案
方案一: 撤成多个 filebeat 实例
filebeat -e -c /etc/filebeat/config/22-system-to-es.yml --path.data /tmp/filebeat

方案二: 日志聚合思路解决问题 
1.安装 rsyslog
yum -y install rsyslog
[root@elk188 ~]$ yum -y install rsyslog


2. 修改配置文件,实现日志集合
[root@elk188 ~]$ vim /etc/rsyslog.conf

1) 开启TCP端口
$ModLoad imtcp
$InputTCPServerRun 514

2) 将所有的日志都重定向到一个位置 (开启日志聚合)
(1) 重定向远程主机(服务器) 比如:
*.* 			@192.168.222.188:514

(2) 重定向到某一个位置,比如:
*.*				/var/log/longchi.log

(3) 查看修改的配置文件
[root@elk188 ~]$ egrep -v "^*#|^$" /etc/rsyslog.conf
$ModLoad imtcp
$InputTCPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                   /var/log/secure
mail.*                                       -/var/log/maillog
cron.*                                       /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                               /var/log/spooler
local7.*                                     /var/log/boot.log
*.*                                          /var/log/longchi.log



3. 重启 rsyslog 服务
[root@elk188 ~]$ systemctl restart rsyslog

4. 查看
[root@elk188 ~]$ ll /var/log/longchi.log
-rw------- 1 root root 795 Oct 24 04:21 /var/log/longchi.log

查看日志
[root@elk188 ~]$ cat /var/log/longchi.log
[root@elk188 ~]$ tail -10f /var/log/longchi.log
Oct 24 04:21:18 elk188 systemd: Stopping System Logging Service...
Oct 24 04:21:18 elk188 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-57.el7_9.3" x-pid="5658" x-info="http://www.rsyslog.com"] exiting on signal 15.
Oct 24 04:21:18 elk188 systemd: Stopped System Logging Service.
Oct 24 04:21:18 elk188 systemd: Starting System Logging Service...
。。。


5. 测试
[root@elk188 ~]$ logger "My name is Jason Yim"
15, 聚合日志配置
(1) 修改 rsyslog 服务配置文件
[root@elk188 ~]$ egrep -v "^*#|^$" /etc/rsyslog.conf
# 开启 tcp 端口
$ModLoad imtcp
$InputTCPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none         /var/log/messages
authpriv.*                                       /var/log/secure
mail.*                                          -/var/log/maillog
cron.*                                           /var/log/cron
*.emerg                                          :omusrmsg:*
uucp,news.crit                                   /var/log/spooler
local7.*                                         /var/log/boot.log
*.*                                              /var/log/longchi.log
# 将所有日志都重定向到 '/var/log/longchi.log'

(2) 重启 rsyslog 服务和测试
systemctl restart rsyslog
logger "My name is Janon Yim"


(3) 编写 filebeat 配置文件
[root@elk188 ~]$ cp /etc/filebeat/config/22-system-to-es.yml /etc/filebeat/config/23-system-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/23-system-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/23-system-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: filestream
  # 是否启动当前的输入类型,默认值为 true
  enabled: true # 启用或禁用
  # 指定数据路径
  paths:
    - /var/log/longchi.log
  # 给当前的输入类型打上标签
  tags: ["rsyslog"]


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  indices:
    - index: "longchi-elk-system-rsyslog-%{+yyyy.MM.dd}"
      # 匹配指定字段包含的内容
      when.contains:
        tags: "rsyslog"


# 关闭索引的生命周期,若开启则上面的 index 配置会被无视
setup.ilm.enabled: false
# 设置索引模板的名称 ,所谓索模板就是创建索引的方式
# setup.template.name: "longchi-linux"
setup.template.name: "longchi-elk-system-rsyslog"
# 设置索引模板的匹配模式
# setup.template.pattern: "longchi-linux*"
setup.template.pattern: "longchi-elk-system-rsyslog*"
# 覆盖已有的索引模板
setup.template.overwrite: false
# 配置索引模板
setup.template.settings:
  # 设置索引的分片数
  index.number_of_shards: 10
  # 设置索引的副本数 生产环境不允许将副本数设置为0 一般设置为1-3,副本数量要求小于集群数量
  index.number_of_replicas: 0


(4) 重启 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/23-system-to-es.yml
16,filebeat 如何使用 黑白名单
aaaa  bbbb  cccc  dddd
# 包含c:
使用白名单实现--->include_lines: ['c']
使用黑名单实现--->exclude_lines: ['a','b','d']

# 排除c
使用白名单实现--->include: ['a','b','d']
使用黑名单实现--->exclude: ['c']


# 系统聚合处理日志配置文件
vim /etc/filebeat/config/24-systemlog-to-es.yml
filebeat.inputs:
- type: filestream
  enabled: true
  paths: 
    - /var/log/longchi.log
  tags: ["rsyslog"]
  
output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  indices:
    - index: "longchi-elk-system-rsyslog-%{+yyyy.MM.dd}"
      when.contains:
        tags: "rsyslog"
        
setup.ilm.enabled: false
setup.template.name: "longchi-elk-system-rsyslog"
setup.template.pattern: "longchi-elk-system-rsyslog*"
setup.template.overwrite: true
setup.template.settings:
  index.number_of_shards: 10
  index.number_of_replicas: 0
  
  
重启 filebeat 实例
rm -rf /var/lib/filebeat/*
filebeat -e -c /etc/filebeat/config/24-systemlog-to-es.yml

注意事项:在 filebeat 重启时,发现终端一直输出数据,一定要注意找到 'ERROR'字段,理解终止启动,然后去 kibana 展示模板去解决问题,比如索引模板已经存在引发的终端数据无法在kibana上展示,需要去删除已经存在的索引模板,清理以前的数据,再次重启,数据就可以在 kibana 上展示了。

[root@elk188 ~]$ wc -l /var/log/longchi.log
4984 /var/log/longchi.log

# 测试
[root@elk188 ~]$ logger "2222"
[root@elk188 ~]$ tail -10f /var/log/longchi.log
17,filebeat 收集路由器和交换机等设备的日志收集
filebeat 的输入TCP案例
发送tcp的两个命令 telnet nc(nmap-ncat)
[root@elk188 ~]$ cp /etc/filebeat/config/24-systemlog-to-es.yml /etc/filebeat/config/25-tcp-to-es.yml

# nc 官网
https://nmap.org/ncat 
https://nmap.org/download.html

# 安装 telnet 和 nc 命令
[root@elk188 ~]$ yum -y install telnet nc
[root@elk187 ~]$ yum -y install telnet nc
[root@elk189 ~]$ yum -y install telnet nc


编写 filebeat 配置文件
[root@elk188 ~]$ vim /etc/filebeat/config/25-tcp-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/25-tcp-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: tcp
  max_message_size: 20MiB
  host: "0.0.0.0:9000"


output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  index: "longchi-elk-tcp-%{+yyyy.MM.dd}"
#  indices:
#    - index: "longchi-elk-tcp-%{+yyyy.MM.dd}"
#      when.contains:
#        tags: "tcp"

setup.ilm.enabled: false
setup.template.name: "longchi-elk-tcp"
setup.template.pattern: "longchi-elk-tcp*"
setup.template.overwrite: true
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0



启动 filebeat 实例
rm -rf /var/lib/filebaet/*
filebeat -e -c /etc/filebeat/config/25-tcp-to-es.yml

测试 kibana 是否展示下面的输入信息(通过客户端189,187将数据发送到188服务端)
[root@elk189 ~]$ nc 192.168.222.188 9000
我是中国人
我爱你祖国母亲
...
[root@elk187 ~]$ nc 192.168.222.188 9000
我们是东方巨人
北京奥运会


假如我们的设备不允许安装 linux 程序,没有办法发送数据,没有办法在里面创建服务,比如说路由器,交换机等,他们没法部署 linux 的各种服务,因为路由器,交换机没有CPU(虽然可以链接设备上,但是也有缺点)架构,所以很多指令不支持,但是我们又想将路由器,交换机等日志打到ES集群,或者其他的一些机器上,但是他们支持TCP发送数据,可以发到服务器9000端口,这样我们就可以将日志做一个收集。

看到如下信息,表示filebeat通过TCP输入的信息已经成功展示在kibana上。

该方案的架构图如下:
18,filebeat 收集路由器和交换机等设备多端口的日志收集
[root@elk188 ~]$ cp /etc/filebeat/config/25-tcp-to-es.yml /etc/filebeat/config/26-tcp-to-es.yml
[root@elk188 ~]$ vim /etc/filebeat/config/26-tcp-to-es.yml
[root@elk188 ~]$ cat /etc/filebeat/config/26-tcp-to-es.yml
# encoding: utf-8
filebeat.inputs:
- type: tcp
  max_message_size: 20MiB
  host: "0.0.0.0:9000"
  tags: ["黑名单"]

- type: tcp
  max_message_size: 20MiB
  host: "0.0.0.0:8000"
  tags: ["用户上报"]

output.elasticsearch:
  enabled: true
  hosts: ["http://192.168.222.187:9200","http://192.168.222.188:9200","http://192.168.222.189:9200"]
  # index: "longchi-elk-system-rsyslog-%{+yyyy.MM.dd}"
  indices:
    - index: "longchi-elk-tcp-black-%{+yyyy.MM.dd}"
      when.contains:
        tags: "黑名单"


    - index: "longchi-elk-tcp-users-%{+yyyy.MM.dd}"
      when.contains:
        tags: "用户上报"


setup.ilm.enabled: false
setup.template.name: "longchi-elk-tcp"
setup.template.pattern: "longchi-elk-tcp*"
setup.template.overwrite: true
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0

启动 filebeat 实例
filebeat -e -c /etc/filebeat/config/25-tcp-to-es.yml
19,filebeat的file输出 日志聚合
[root@elk188 ~]$ mkdir -pv /tmp/filebeat
mkdir: created directory '/tmp/filebeat'
[root@elk188 ~]$ cp /etc/filebeat/config/25-tcp-to-es.yml /etc/filebeat/config/27-tcp-to-file.yml                                 [root@elk188 ~]$ vim /etc/filebeat/config/27-tcp-to-file.yml
[root@elk188 ~]$ cat /etc/filebeat/config/27-tcp-to-file.yml
# encoding: utf-8
filebeat.inputs:
- type: tcp
  max_message_size: 20MiB
  host: "0.0.0.0:9000"

output.file:
  path: "/tmp/filebeat"
  filename: longchi-linux
  # 指定文件滚动大小,默认值是20M
  rotate_every_kb: 10000
  # 指定保存文件个数 范围2-1024个文件 默认是7个文件
  number_of_files: 1023
  # 指定文件权限,默认权限是0600
  permissions: 0600


启动 filebeat 实例
filebeat -e -c /etc/filebeat/config/27-tcp-to-file.yml
20,filebeat 收集日志到 redis 服务
(1) 部署 redis 服务
yum -y install epel-release
yum -y install redis
yum -y install redis epel-release
  
# 查看 redis 服务的自启动配置文件 
[root@elk187 ~]$ systemctl cat redis
# /usr/lib/systemd/system/redis.service

(2) 修改配置文件
[root@elk187 ~]$ vim /etc/redis.conf
[root@elk187 ~]$ egrep -v "^*#|^$" /etc/redis.conf
将源配置文件修改如下两行即可
bind 0.0.0.0
requirepass longchi

(3) 启动 redis 服务
systemctl start redis
systemctl enable redis
systemctl status redis
ss -ntl

(4) 其他节点连接测试 redis 环境是否正常使用
测试  '--raw' 表示指定严格日志输出 '-n 5' 表示连接5号数据库
redis-cli -a longchi -h 192.168.222.187 -p 6379 --raw -n 5

[root@elk189 ~]$ redis-cli -a longchi -h 192.168.222.187 -p 6379 --raw
192.168.222.187:6379> KEYS *

192.168.222.187:6379> KEYS *
school
192.168.222.187:6379> get school
longchi
192.168.222.187:6379> FLUSHALL
OK
# 进入5号数据库
[root@elk189  ~]$ redis-cli -a longchi -h 192.168.222.187 -p 6379 --raw -n 5
192.168.222.187:6379[5]>

(5) 将 filebeat 数据写入到 Redis 环境
编写filebeat配置文件
[root@elk188 ~]$ vim /etc/filebeat/config/28-tcp-to-redis.yml
[root@elk188 ~]$ cat /etc/filebeat/config/28-tcp-to-redis.yml
# encoding: utf-8
filebeat.inputs:
- type: tcp
  max_message_size: 20MiB
  host: "0.0.0.0:9000"

output.redis:
  # 写入redis集群的主机
  hosts: ["192.168.222.187:6379"]
  # 指定redis认证口令
  password: "longchi"
  # 指定的key值
  key: "longchi-linux-filebeat"
  # 指定连接数据库的编号
  db: 5
  # 规定超时时间
  timeout: 3


(6) 启动 filebeat 实例
filebeat -e -c /etc/filebeat/config/28-tcp-to-redis.yml

(7) 写入数据有两种方式
1) 直接终端写入 
[root@elk187 ~]$ echo 33333333333333333333333333333333333333333 | nc 192.168.222.188 9000
[root@elk187 ~]$ cat /etc/hosts | nc 192.168.222.188 9000




2) 登录 nc 192.168.222.188 9000 终端,在终端直接输入

[root@elk187 ~]$ nc 192.168.222.188 9000
my name is zengguoqing
111111111111111111111111111111111111111111111111111
222222222222222222222222222222222222222222222222222222


  
(8) 测试 从客户端登录,查看写入数据数据
redis-cli -a longchi -h 192.168.222.187 -p 6379 -n 5
# 登录redis数据库
[root@elk189 ~]$ redis-cli -a longchi -h 192.168.222.187 -p 6379 -n 5
# 查看里面的key值
192.168.222.187:6379[5]> KEYS *
1) "longchi-linux-filebeat"
# 查看 key 值的类型
192.168.222.187:6379[5]> TYPE longchi-linux-filebeat
list
# 查看输入结果
192.168.222.187:6379[5]> LRANGE longchi-linux-filebeat 0 -1
1) "{\"@timestamp\":\"2024-10-25T12:17:02.405Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"_doc\",\"version\":\"7.17.3\"},\"message\":\"AAAAAAA\",\"input\":{\"type\":\"tcp\"},\"ecs\":{\"version\":\"1.12.0\"},\"host\":{\"name\":\"elk188.longchi.xyz\"},\"agent\":{\"name\":\"elk188.longchi.xyz\",\"type\":\"filebeat\",\"version\":\"7.17.3\",\"hostname\":\"elk188.longchi.xyz\",\"ephemeral_id\":\"d7c7fbc0-ab15-4085-b610-d004fad9654f\",\"id\":\"28d4655d-de6a-4d4b-9aec-3ce92bcbcf11\"},\"log\":{\"source\":{\"address\":\"192.168.222.187:46194\"}}}"
2) "{\"@timestamp\":\"2024-10-25T12:17:07.237Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"_doc\",\"version\":\"7.17.3\"},\"message\":\"BBBBBBB\",\"log\":{\"source\":{\"address\":\"192.168.222.187:46194\"}},\"input\":{\"type\":\"tcp\"},\"host\":{\"name\":\"elk188.longchi.xyz\"},\"agent\":{\"type\":\"filebeat\",\"version\":\"7.17.3\",\"hostname\":\"elk188.longchi.xyz\",\"ephemeral_id\":\"d7c7fbc0-ab15-4085-b610-d004fad9654f\",\"id\":\"28d4655d-de6a-4d4b-9aec-3ce92bcbcf11\",\"name\":\"elk188.longchi.xyz\"},\"ecs\":{\"version\":\"1.12.0\"}}"
3) "{\"@timestamp\":\"2024-10-25T12:17:10.977Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"_doc\",\"version\":\"7.17.3\"},\"agent\":{\"version\":\"7.17.3\",\"hostname\":\"elk188.longchi.xyz\",\"ephemeral_id\":\"d7c7fbc0-ab15-4085-b610-d004fad9654f\",\"id\":\"28d4655d-de6a-4d4b-9aec-3ce92bcbcf11\",\"name\":\"elk188.longchi.xyz\",\"type\":\"filebeat\"},\"message\":\"CCCCCCC\",\"log\":{\"source\":{\"address\":\"192.168.222.187:46194\"}},\"input\":{\"type\":\"tcp\"},\"ecs\":{\"version\":\"1.12.0\"},\"host\":{\"name\":\"elk188.longchi.xyz\"}}"
192.168.222.187:6379[5]>



# 官网参考地址
https://www.elastic.co/guide/en/beats/filebeat/7.17/redis-output.html
# 官网参考内容如下:
output.redis:
  hosts: ["localhost"]
  password: "my_password"
  key: "filebeat"
  db: 5
  timeout: 3
21,从redis类型读取数据[从慢日志中读取,目前是测试阶段]
(1) 启动redis
cat > /oldboyedu/softwares/redis/redis16379.conf << EOF
port 16379
daemonize yes
bind 10.0.0.108
requirepass "oldboyedu_linux77"
slowlog-max-len=1
slowlog-log-slower-than=1000
EOF

redis-server /oldboyedu/softwares/redis/redis16379.conf

(2) 链接 redis 进行测试
redis-cli -h 10.0.0.108 -p 16379 -a oldboyedu_linux77

(3) 编写 filebeat 配置文件
filebeat.inputs:
- type: redis
  hosts: ["10.0.0.108:16379"]
  network: tcp4
  passwoed: "oldboyedu_linux77"
  timeout: 3
  
output.console:
  pretty: true

补充知识 rsyslog

安装 rsyslog

[root@elk188 ~]$ yum -y install rsyslog
[root@elk188 ~]$ systemctl cat rsyslog
# /usr/lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure

[Install]
WantedBy=multi-user.target
;Alias=syslog.service

一、rsyslog简介

Rsyslog的全称是 rocket-fast system for log ,可用于接受来自各种来源的输入,转换 它们,并将结果输出到不同的目的地。 

它提供了高性能、强大的安全功能和模块化设计。虽然rsyslog最初是一个常规的系 统日志,但它已经发展成为一种瑞士军刀式的日志记录,当应用有限处理时, RSYSLOG每秒可以向本地目的地发送超过一百万条消息。即使使用远程目的地和更 精细的处理,性能通常被认为是"惊人的"。 

rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日 志消息。rsyslog守护进程可以被配置成两种环境,一种是配置成日志收集服务器, rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发 送到另外的远程服务器。rsyslog的另外一个用法,就是可以配置为客户端,用来过 滤和发送内部日志消息到本地文件夹(如/var/log)或一台可以路由到的远程rsyslog 服务器上。 

官网地址:https://www.rsyslog.com/ 

在 CentOS 6.x 中,日志服务已经由 rsyslogd 取代了原先的 syslogd。Red Hat 公司 认为 syslogd 已经不能满足工作中的需求,rsyslogd 相比 syslogd 具有一些新的特 点: 

基于TCP网络协议传输日志信息。 

更安全的网络传输方式。 

有日志信息的即时分析框架。 

后台数据库。 

在配置文件中可以写简单的逻辑判断。 

与syslog配置文件相兼容。 

rsyslogd 日志服务更加先进,功能更多。但是,不论是该服务的使用,还是日志文 件的格式,其实都是和 syslogd 服务相兼容的,所以学习起来基本和 syslogd 服务一 致。 

    系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息 给予这个服务,它就会自动地把日志按照特定的格式记录到不同的日志文件中。也就 是说,采用 rsyslogd 服务管理的日志文件,它们的格式应该是统一的。 

    在 Linux 系统中有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 服务, 它的日志是由 Apache 软件自己产生并记录的,并没有调用 rsyslogd 服务。但是为 了便于读取,apache 日志文件的格式和系统默认日志的格式是一致的。 
我们如何知道 Linux 中的 rsyslogd 服务是否启动了呢?如何查询 rsyslogd 服务的自 启动状态呢?命令如下:
ps aux | grep "rsyslog" | grep -v "grep"


[root@elk188 ~]$ ps aux | grep "rsyslog" | grep -v "grep"
root       1030  0.0  0.0 216400  5012 ?        Ssl  00:04   0:00 /usr/sbin/rsyslogd -n

#有rsyslogd服务的进程,所以这个服务已经启动了
#centos6.x查看服务有无开机自启
 
[root@localhost ~]# chkconfig --list | grep rsyslog
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
#rsyslog服务在2、3、4、5运行级别上是开机自启动的

#centos7.x查看服务有无开机自启
systemctl  list-unit-files rsyslog.service

[root@elk188 ~]$ systemctl  list-unit-files rsyslog.service
UNIT FILE       STATE
rsyslog.service enabled
1 unit files listed.

二、常见日志格式及文件

日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录 信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。这 些信息有些非常敏感,所以在 Linux 中这些日志文件只有 root 用户可以读取。 那么,系统日志文件保存在什么地方呢?还记得 /var/ 目录吗?它是用来保存系统动 态数据的目录,那么 /var/log/ 目录就是系统日志文件的保存位置。我们通过表 1 来 说明一下系统中的重要日志文件。

日志文件 说明解释
/var/log/cron 记录与系统定时任务相关的日志
/var/log/cups/ 记录打印信息的日志
/var/log/dmesg 记录系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/btmp 记录错误登录的日志。这个文件是二进制文件,不能直接用vim查看,而要使用 lastb 命令查看。命令如下: [root@elk188 ~]$ lastb root tty1 btmp begins Wed Oct 2 17:44:27 2024
/var/log/lastlog 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件不能直接用vim查看。而要使用 lastlog命令查看
/var/log/maillog 记录邮件信息的日志
/var/log/messages 它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O错误,网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为root,已经用户自定义安装软件的日志,也会在这里列出。
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如系统的登录,ssh的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp 永久记录所有用户的登录,注销信息,同时记录系统的后动,重启,关机事件。同样,这个文件也是二进制文件,不能直接用vim查,而要使用last命令查看
/var/tun/ulmp 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用vim查看,而要使用w,who,users等命令查看

除系统默认的日志之外,采用 RPM 包方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志存放在源码包指定的目录中)。不过这些 日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档 来记录自身的日志。以下介绍的日志目录在你的 Linux 上不一定存在,只有安装了相应的服务,日志才会出现。服务日志如表 2 所示:

日志文件 说明
/var/log/httpd/ RPM包安装的apache服务的默认日志目录
/var/log/mail/ RPM包安装的邮件服务的额外日志目录
/var/log/samba/ RPM包安装的Samba服务的日志目录
/var/log/sssd/ 守护进程安全服务目录

三、Linux日志文件的格式分析

只要是由日志服务 rsyslogd 记录的日志文件,它们的格式就都是一样的。所以我们只要了解了日志文件的格式,就可以很轻松地看懂日志文件。

日志文件的格式包含以下 4 列:

复制代码
事件产生的时间。
​
产生事件的服务器的主机名。
​
产生事件的服务名或程序名。
​
事件的具体信息。

我们查看一下 /var/log/secure 日志,这个日志中主要记录的是用户验证和授权方面的信息,更加容易理解。命令如下:

复制代码
[root@localhost ~]# vim /var/log/secure

Nginx日志常用参数详解

log_format json '{"@timestamp":"$time_iso8601",'
                     '"scheme":"$scheme",'
                     '"http_referer":"$http_referer",'
                     '"args":"$args",'
                     '"http_user_agent":"$http_user_agent",'
                     '"remote_addr":"$remote_addr",'
                     '"hosts":"$host",'
                     '"server_name":"$server_name",'
                     '"server_protocol":"$server_protocol",'
                     '"request_method":"$request_method",'
                     '"request_uri":"$request_uri",'
                     '"uri":"$uri",'
                     '"request_length":"$request_length",'
                     '"body_byte_sent": "$body_bytes_sent",'
                     '"request_time":"$request_time",'
                     '"server_addr":"$server_addr",'
                     '"status": $status,'
                     '"bytes_sent":"$bytes_sent",'
                     '"upstream_addr":"$upstream_addr",'
                     '"upstream_status":"$upstream_status",'
                     '"upstream_connect_time":"$upstream_connect_time",'
                     '"upstream_response_time":"$upstream_response_time",'
                     '"request_id":"$request_id"'
                     '}';
 
可以加上这些:
$request_filename:当前请求的文件路径,由root或alias指令与URI请求生成。
$http_cookie:客户端cookie信息
$http_host #请求地址,即浏览器中你输入的地址(IP或域名)
$server_port:请求到达服务器的端口号。
$connection_requests 当前通过一个连接获得的请求数量。

$remote_addr:记录访问网站的客户端地址

$remote_user:远程客户端用户名称
$time_local:记录访问时间与时区
$request:表示request请求头的行

$status:http状态码,记录请求返回的状态,例如:200、404、301等
$body_bytes_sent:服务器发送给客户端的响应body字节数,发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。


$http_referer:记录此次请求是从哪个链接访问过来的,可以根据refer进行防盗链设置
$http_user_agent:记录客户端访问信息,例如:浏览器,手机客户端等

$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
$ssl_protocol:SSL协议版本
$ssl_cipher:交换数据中的算法
$upstream_status:upstream状态,比如成功是200
$upstream_addr:当ngnix做负载均衡时,可以查看后台提供真实服务的设备
$upstream_response_time:请求过程中,upstream响应时间

$request_time:整个请求的总时间,请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$args:这个变量等于请求行中的参数,同$query_string
$content_length:请求头中的Content-length字段。
$content_type:请求头中的Content-Type字段。
$document_root:当前请求在root指令中指定的值。
$host:请求主机头字段,否则为服务器名称。
$http_user_agent:客户端agent信息
$http_cookie:客户端cookie信息
$limit_rate:这个变量可以限制连接速率。
$request_method:客户端请求的动作,通常为GET或POST。
$remote_addr:客户端的IP地址。
$remote_port:客户端的端口。
$remote_user:已经经过Auth Basic Module验证的用户名。
$request_filename:当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme:HTTP方法(如http,https)。
$server_protocol:请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr:服务器地址,在完成一次系统调用后可以确定这个值。
$server_name:服务器名称。
$server_port:请求到达服务器的端口号。
$request_uri:包含请求参数的原始URI,不包含主机名,如:"/foo/bar.php?arg=baz"。
$uri:不带请求参数的当前URI,$uri不包含主机名,如"/foo/bar.html"。
$document_uri:与$uri相同。 
如何将nginx日志滚动一次,清除旧日志
[root@elk188 ~]$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 18 Oct 2024 07:02:08 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 29 May 2024 19:07:19 GMT
Connection: keep-alive
ETag: "66577ce7-267"
Accept-Ranges: bytes

[root@elk188 ~]$ cat /var/log/nginx/access.log
127.0.0.1 - - [17/Oct/2024:16:59:40 -0700] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.222.1 - - [17/Oct/2024:17:46:34 -0700] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0" "-"
192.168.222.1 - - [17/Oct/2024:17:46:34 -0700] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.222.188/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0" "-"
192.168.222.1 - - [17/Oct/2024:17:47:54 -0700] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" "-"
192.168.222.1 - - [17/Oct/2024:17:47:54 -0700] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.222.188/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" "-"
192.168.222.1 - - [17/Oct/2024:17:50:15 -0700] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" "-"
192.168.222.1 - - [17/Oct/2024:17:52:32 -0700] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" "-"
192.168.222.1 - - [17/Oct/2024:17:53:13 -0700] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0" "-"

{"@timestamp":"2024-10-18T00:02:08-07:00","@source":"127.0.0.1","idc":"huzhou","http_cookie":"-","hostname":"elk188.longchi.xyz","ip":"-","client":"127.0.0.1","request_method":"HEAD","scheme":"http","domain":"localhost","referer":"-","request":"/","args":"-","size":0,"request_body":"-","status": 200,"responsetime":0.000,"upstreamtime":"-","upstreamaddr":"-","http_user_agent":"curl/7.29.0","https":""}

# 日志滚动一次,清除旧日志
[root@elk188 ~]$ >/var/log/nginx/access.log
[root@elk188 ~]$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 18 Oct 2024 07:08:01 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 29 May 2024 19:07:19 GMT
Connection: keep-alive
ETag: "66577ce7-267"
Accept-Ranges: bytes

[root@elk188 ~]$ cat /var/log/nginx/access.log
{"@timestamp":"2024-10-18T00:08:01-07:00","@source":"127.0.0.1","idc":"huzhou","http_cookie":"-","hostname":"elk188.longchi.xyz","ip":"-","client":"127.0.0.1","request_method":"HEAD","scheme":"http","domain":"localhost","referer":"-","request":"/","args":"-","size":0,"request_body":"-","status": 200,"responsetime":0.000,"upstreamtime":"-","upstreamaddr":"-","http_user_agent":"curl/7.29.0","https":""}

九,filebeat企业常见案例(EFK架构)

1,使用 filebeat 收集 nginx 日志到 es 集群
相关推荐
Karoku06620 小时前
【企业级分布式系统】ELK-企业级日志分析系统
运维·数据库·redis·mysql·elk·缓存
一名技术极客1 天前
徒手从零搭建一套ELK日志平台
elk
jun7788954 天前
SpringBoot整合ELK使用详解
spring boot·后端·elk
yueqingll4 天前
023、ELK 从入门到实践
elk
abandondyy4 天前
ELK Elasticsearch 集群部署
大数据·elk·elasticsearch
小李叭叭叭4 天前
ELK8.15.4搭建开启安全认证
运维·elk·elasticsearch·kibana
光仔December11 天前
【Elasticsearch入门到落地】1、初识Elasticsearch
大数据·elk·elasticsearch·搜索引擎·lucene
太空眼睛12 天前
【EFK】Linux集群部署Elasticsearch最新版本8.x
linux·elk·elasticsearch·efk·master·8.15.3·node.roles
Shenqi Lotus16 天前
ELK-ELK基本概念_ElasticSearch的配置
elk·elasticsearch