登录
原创

windows 下logstash读取文件的坑

发布于 2020-10-09 阅读 2993
  • Elasticsearch
  • Logstash
原创

上一篇文章介绍了在windows上搭建简单的elk环境的过程,但是在input的部分只用到了stdin()的功能,我们做elk监视日志肯定不可能这么简单,所以考虑将input的内容改为监视ng的access.log文件。由于网上相关资料比较少,踩坑无数, 这篇主要记录在导入数据时候踩到的坑。废话不多说直接进入正题

logstash导入的数据必须是es上已存在的索引

这个是最简单也是最先遇到的问题,解决办法也很简单:直接去es上创建一个索引。至于创建索引我用的是Elasticsearch-head插件直接创建索引
image.png
创建完的logstash.conf如下

input {
  file {
      path => ["C:\phpStudy\PHPTutorial\nginx\logs\error.log"]
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "logstash-2020.10.09_errorlogs"
  }
}

windows下文件目录写法问题

第二个问题也很容易想到反正windows环境下文件读取不到一定是你把斜杠写成了反斜杠,做下修改之后的conf文件

input {
  file {
      path => ["C:/phpStudy/PHPTutorial/nginx/logs/error.log"]
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "logstash-2020.10.09_errorlogs"
  }
}

文件读取位置不正确

如果你要读取一个已经有内容的日志文件,然后上面两个方法用过了之后你的索引下还是空的。那么你可以试试在input中加入

 start_position => "beginning"

因为logstash默认设置start_position的值为end,也就是只读取最新的更新内容。加上beginning会让logstash从头读取文件。
修改过后我们的conf文件如下

input {
  file {
      path => ["C:/phpStudy/PHPTutorial/nginx/logs/error.log"]
      start_position => "beginning"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "logstash-2020.10.09_errorlogs"
  }
}

sincedb通道的问题

这是一个隐藏很深的问题,如果我们的conf文件如上面一样配置完后理论上应该可以执行了,但很多时候logstash依然卡在

 Successfully started Logstash API endpoint {:port=>9600}

然后发现文件内容并没有写入es,这种情况可能导致的原因是:这个管道已经在一个点运行,从而生成一个sincedb 文件。所以当我们重复操作同一个文件进行调试时可以将每次生成的sincedb文件删除。而且当我们启动和关闭logstash时logstash都会为你创建这个文件,所以记得确保当你去启动logstash时这个sincedb文件是不存在的。

读取不到最后一行的问题

在成功读取到了文件后,我尝试对access.log文件做了一些修改操作来查看elk实时监控日志文件的功能是否正常运作然后发现:能成功找到文件.png
但是似乎每次修改完都无法读取最后一条的内容:读取文件无法读取最后一行.png
网上找了很多资料,问题似乎出在logstash并不知道你是否已经更新完最后一行内容,所以解决办法就是在每行最后插入一个换行符。
不过ng的日志好像默认会插入,反正按照正常的操作流程并不会出现读取不到最后一行的问题,所以不再深究

后记

以上是我根据自己的问题整理的一些windows下常见的logstash踩得坑,以后如果还有其他问题我会继续更新,有什么问题可以在评论区讨论。
好了,就这么多了~

评论区

励志做一条安静的咸鱼,从此走上人生巅峰。

4

1

5

举报