使用filebeat读取nginx日志,传给logstash,在logstash中通过配置message的正则匹配规则,将nginx分割出我们想要的字段。整个过程容易理解,不过初次调试grok里面的匹配规则,真是有点抓狂,logstash重启一次挺麻烦,每次修改都去重启logstash也不方便啊,好在有一个现成的grokdebug在线调试工具:https://grokdebug.herokuapp.com/ ,这个链接里也有一些规则参考:https://grokdebug.herokuapp.com/patterns#
不过即便如此,还是不太方便,因为在grokdebug中调试通过的匹配放到logstash配置文件中后并不能直接使用,有一些引号之类的还是需要注意。做个记录:本文地址:http://www.04007.cn/article/835.html,未经许可,不得转载.
#如下为nginx日志格式 log_format main '$remote_addr $remote_user $host [$time_local] "$request" ' '$status $uid $body_bytes_sent $upstream_addr $upstream_response_time "$http_referer" ' '"$http_user_agent" "$http_X_Forwarded_Proto" "$http_x_forwarded_for"'; #日志示例 10.8.32.226 - oemu.bytedance.com "POST /course/183/task/310/trigger HTTP/1.1" 200 User-4048 340 10.147.59.101:80 0.016 "https://oemu.bytedance.com/course/183/task/310/show" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "https" "183.17.232.43, 202.104.186.162" #我在grok上调试通过的对应规则示例 %{IPV4:remote_ip} (-|%{WORD:remote_user}) %{IPORHOST:host} "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} User-%{WORD:userid} %{NUMBER:response} %{IPV4:upstream_ip}:80 %{NUMBER:uptime} (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent} %{QS:xforwardedproto} %{QS:xforwardedfor} #添加进logstash配置文件中的filter user@u007:/opt/logstash/logstash-7.7.1/config$ cat nginxlog.conf # Beats -> Logstash -> Elasticsearch pipeline. input { beats { port => 5044 } } filter { grok { match => {"message" => '%{IPV4:remote_ip} (-|%{WORD:remote_user}) %{IPORHOST:host} "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} User-%{WORD:userid} %{NUMBER:response} %{IPV4:upstream_ip}:80 %{NUMBER:uptime} (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent} %{QS:xforwardedproto} %{QS:xforwardedfor}'} } } output { elasticsearch { hosts => ["http://192.168.1.11:9200", "http://192.168.1.13:9200" ,"http://192.168.1.17:9200"] index => "nginxlog-%{+YYYY.MM.dd}" } stdout { codec=> rubydebug } } #启动logstash命令,但发现报错 [2020-06-19T13:52:09,791][ERROR][logstash.agent ] Failed to execute action {:action=>LogStash::PipelineAction:: Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of [ \\t\\r\\n], \"#\", \"if \", [A-Za-z0-9_-], '\"', \"'\", \"}\" at line 11, column 1 (byte 154) after filter {\n", :backtrace=>["/data00/logstash/l ogstash-7.7.1/logstash-core/lib/logstash/compiler.rb:58:in `compile_imperative'", #使用-t选项检查配置文件发现有错误 user@u007:/opt/logstash/logstash-7.7.1$ bin/logstash -f config/nginxlog.conf -t Sending Logstash logs to /opt/logstash/logstash-7.7.1/logs which is now configured via log4j2.properties [2020-06-19T13:56:20,532][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified [2020-06-19T13:56:21,014][FATAL][logstash.runner ] The given configuration is invalid. Reason: Expected one of [ \t\r\n], "#", "if", [A-Za-z0-9_-], '"', "'", "}" at line 11, column 1 (byte 154) after filter { [2020-06-19T13:56:21,019][ERROR][org.logstash.Logstash ] java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit本文地址:http://www.04007.cn/article/835.html,未经许可,不得转载.
此处碰到的LogStash::ConfigurationError, :message=>Expected one of..第一次遇到,但通过调试发现去掉filter就正常,说明还是filter规则有问题。这个错误问题出在message规则那部分是我从外面复制粘贴了一下,里面有一些我们看不见的乱码导致的。注意看提示的错误日志位置,找到位置删掉一些前端的内容重新换行输入。我这里觉得问题除了是我复制的内容之外,我在换行后会使用tab键来调位置,但LogStash配置文件中好像不能支持\t,只能使用空格 。网上也有一些反映是文件编码格式问题,改为UTF-8无BOM模式,不过我这里不是这个问题点。
修复了格式问题之后我再进行了启动LogStash,启动正常且数据也能从filebeat输入LogStash,但仍然出现问题,因为filter设置的规则没有起作用,想分离出来的字段没有看到。通过LogStash终端数据也可以看到tags字段中有提示信息 beats_input_codec_plain_applied,_grokparsefailure,说明filter规则不对,但正如开遍所说,我这些规则在grokdebug中都调试通过了的。只能对filter进行细致排查,逐渐增加filter的长度慢慢调试发现问题。最后发现双引号处容易出问题,需要加反斜线。另外使用QS会引起错误,我这里改成了使用DATA,简单好用。调试通过的规则如下:本文地址:http://www.04007.cn/article/835.html,未经许可,不得转载.
"message" => '%{IPV4:remote_ip} .* \"%{DATA:method} %{DATA:request} %{DATA:httpversion}\" %{NUMBER:status} User-%{WORD :userid} %{DATA:response} %{DATA:upstream_ip} %{DATA:uptime}'本文地址:http://www.04007.cn/article/835.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/835.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/835.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |