Logstash日志同步工具

安装logstash

如果有yum源可以直接安装

yum install  logstash -y

如果没有yum源,可以官方下载相关软件包https://www.elastic.co/cn/downloads/logstash

配置logstash

配置文件介绍

配置文件:/etc/logstash/conf.d/audit-logstash.conf
如果有多个配置文件,可以一起存放在/etc/logstash/conf.d目录,配置文件格式:以.conf结尾,启动服务时会自动加载conf.d目录下所有配置文件。
但需要注意一点:所有配置文件中的input输出,会流向所有的output,即有配置文件:conf1和conf2,conf1中配置的input输入数据会流向conf1和conf2中的output输出流中。
因此,为了避免这一点,可以在input中添加type或特定标签,在output中对输入流数据进行判断,再输出。具体参考下面配置内容

input{
  file{
    path => ["/data/logs/ngiam-*/audit.log"]  ##读取哪些文件,支持通配符*,可以采用数组方式添加多文件
    start_position => "beginning"              ##从头开始读取
    stat_interval => 1
    discover_interval => 2
    ignore_older => 7776000                    ##时间,秒单位
    sincedb_path => "/var/lib/logstash/.sincedb_ngiam"  ##sincedb数据库
    add_field => {"log_type"=>"audit"}
    codec => "json"
  }
}
output{                                 ##这里是输入到两套es里面,一套相应删除即可
 if [log_type] == "audit" {
  elasticsearch{
    hosts => ["rhel-ngiam-7", "rhel-ngiam-8", "rhel-ngiam-9"]  ##输出到哪些es里面
    codec => "json"
    index => "audit-%{+YYYY.MM.dd}"                            ##存储格式
  }
  elasticsearch{
    hosts => ["rhel-ngiam-16", "rhel-ngiam-17", "rhel-ngiam-18"]
    codec => "json"
    index => "audit-%{+YYYY.MM.dd}"
  }
}
}

sincedb数据库文件功能介绍

这个库(Ruby Gem )支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心 logstash 会漏过你的数据。
sincedb 文件默认存放在logstash家目录下,比如通过自动安装的logstash家目录一般都在:/var/lib/logstash目录。
sincedb文件是以点.开头的隐藏文件

[admin@rhel-ngiam-10 ~]$ ll /var/lib/logstash/ -a
总用量 12
drwxrwxr-x   2 logstash logstash   77 12月  3 15:57 .
drwxr-xr-x. 70 root     root     4096 9月  24 14:15 ..
-rw-r--r--   1 logstash logstash   39 8月  17 13:21 .sincedb_ad35108f84e0d48d730e62398efdc349
-rw-r--r--   1 logstash logstash  936 12月  3 15:57 .sincedb_ngiam

sincedb 文件中记录了每个被监听的文件的 inode, major number, minor number 和 pos。
其中
inode为读取的audit.log或其它文件的inode值,inode为linux系统每个文件分配的一个记录值,每个文件的inode值都不同(硬连接文件除外),
major number:
minor number:
pos: 当前logstash读取到inode指定文件的位置(即读取的文件大小值:单位byte)

具体内容如下:

[admin@rhel-ngiam-10 ~]$ cat  /var/lib/logstash/.sincedb_ngiam
268478633 0 64768 619
268653282 0 64768 2933
268653285 0 64768 12566
268715906 0 64768 1854
268653292 0 64768 769

使用stat查看日志文件,Inode对应的第一列,文件大小为619byte,和第四列对应上了,说明当前文件已经读取完了,如果pos数值小于文件大小,说明还没有读取完成,或者audit.log日志文件正有日志写入,logstash还未即时同步完成后记录到sincedb文件中。

如果logstash没有自动生成.sincedb_ngiam文件,则可以手动创建,并修改属主组为logstash,接着杀掉logstash进程,重启logstash服务。

Logstash重启后,默认是读取.sincedb文件,然后根据其中记录的pos,上次读取到的位置,继续往后读取数据,不会从日志开头重新读取一遍数据。
若在某些特殊场景下,需要定制读取某个日志文件,或要求读取从日志文件的开头重新读取时,则请参考下面方式:

漏掉的日志文件如何读取

由于logstash服务因为某些特殊原因或异常引起的故障,导致logstash服务停止,等待logstash启动时,已经过了几天,类似/data/sso-rst/logs/的日志目录中日志文件已经归档,
生成了以下几个文件:
audit.log.2021-11-11 audit.log.2021-11-12 audit.log.2021-11-13 audit.log(默认即为当天的日志)
而.sincedb中记录的最新inode为2021-11-11当天的日志文件:audit.log.2021-11-11
当重启logstash时,只会自动从停止时读取audit.log.2021-11-11日志的位置,读取完该日志的所有内容,然后开始读取今天的audit.log日志内容,从而跳过了停止中间产生的另外三个日志文件,
要解决该问题,需要修改logstash配置文件:
修改input下file插件中:

path => ["/data/logs/ngiam-*/audit.log"]
为
path => ["/data/logs/ngiam-*/audit.log","/data/logs/ngiam-*/audit.log.2021-11-11","/data/logs/ngiam-*/audit.log.2021-11-12","/data/logs/ngiam-*/audit.log.2021-11-13"]
ignore_older => 7776000 

其中
ignore_older:
logstash默认不处理一天前的文件。
如果你有一些老文件的内容需要处理(该文件又不会新增内容,只是要处理已有内容),那么该值需要设置得较大才行,否则这些文件将会被忽略。
比如读取一个月以内的老文件: ignore_older => 2592000 值2592000=60*60*24*30表示一个月30天的总秒数。 三个月60*60*24*30*3=7776000
读取一年以内的老文件:ignore_older => 31536000

添加上读取这几个日志文件,然后启动logstash, 等待查看最新的.sincedb文件上记录是否有这三个文件的信息,当记录的位置等于文件大小,说明logstash读取完成该日志内容。
注意:若读取的日志文件过大,.sincedb中并不会马上记录相应的记录,需要等待一段时间,等同步完成后才会进行记录。

logstash从头读取某个日志文件的方法

若因此某种实际需要,要求从头开始读取某个日志文件内容,同样需要修改配置文件:
比如想要重新读取audit.log.2021-11-11日志文件为例:
修改input下file插件中:

path => ["/data/logs/ngiam-*/audit.log"]
为
path => ["/data/logs/ngiam-*/audit.log.2021-11-11"]

同时在path配置下添加一项:
path => ["/data/logs/ngiam-*/audit.log.2021-11-11"]
start_position => "beginning"
ignore_older => 7776000 

start_position:
logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。
如果你是要导入原有数据,把这个设定改成 “beginning”,logstash 进程就从头开始读取,有点类似 cat,但是读到最后一行不会终止,而是继续变成 tail -F。
start_position 仅在该日志文件从未被监听过的时候起作用。如果 sincedb 文件中已经有这个文件的 inode 记录了,那么 logstash 依然会从记录过的 pos 开始读取数据。
所以重复测试的时候每回需要删除 sincedb 文件或删除sincedb中相应文件inode的记录内容。
ignore_older:
参数说明上述已解释。
logstash默认不处理一天前的文件,在处理几天年的日志文件,必须添加该参数。

如果该读取文件audit.log.2021-11-11的inode已经记录在sincedb上,如果有多个sincedb文件,可以通过下面命令查看:
若文件audit.log.2021-11-11的inode为606436871
grep -rn “606436871” .sincedb*
若有记录,删除相应inode记录信息,重新启动logstash,重头开始读取日志文件:audit.log.2021-11-11

sincedb参数说明:

  • discover_interval

    logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒。

  • exclude

    不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开。

  • sincedb_path

    如果你不想用默认的 $HOME/.sincedb(Windows 平台上在 C:\Windows\System32\config\systemprofile.sincedb),
    可以通过这个配置定义 sincedb 文件到其他位置。

  • sincedb_write_interval

    logstash 每隔多久写一次 sincedb 文件,默认是 15 秒。

  • stat_interval

    logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。

  • start_position

    logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。
    如果你是要导入原有数据,把这个设定改成 “beginning”,logstash 进程就从头开始读取,有点类似 cat,
    但是读到最后一行不会终止,而是继续变成 tail -F。

  • ignore_older

    logstash默认不处理一天前的文件,该参数表示在过去指定秒数时间范围外的老日志文件在读取时将会被忽略掉。即忽略掉距今超过多少秒以前的文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值