上一篇文章介绍了在windows上搭建简单的elk环境的过程,但是在input的部分只用到了stdin()的功能,我们做elk监视日志肯定不可能这么简单,所以考虑将input的内容改为监视ng的access.log文件。由于网上相关资料比较少,踩坑无数, 这篇主要记录在导入数据时候踩到的坑。废话不多说直接进入正题
logstash导入的数据必须是es上已存在的索引
这个是最简单也是最先遇到的问题,解决办法也很简单:直接去es上创建一个索引。至于创建索引我用的是Elasticsearch-head插件直接创建索引
创建完的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实时监控日志文件的功能是否正常运作然后发现:
但是似乎每次修改完都无法读取最后一条的内容:
网上找了很多资料,问题似乎出在logstash并不知道你是否已经更新完最后一行内容,所以解决办法就是在每行最后插入一个换行符。
不过ng的日志好像默认会插入,反正按照正常的操作流程并不会出现读取不到最后一行的问题,所以不再深究
后记
以上是我根据自己的问题整理的一些windows下常见的logstash踩得坑,以后如果还有其他问题我会继续更新,有什么问题可以在评论区讨论。
好了,就这么多了~