我有这样的fluentd
配置:
<source>
@type tail
<parse>
@type regexp
expression /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] \"(?<method>\w+) (?<path>[^ ]*) (?<http>[^ ]*)" (?<status_code>[^ ]*) (?<size>[^ ]*)(?:\s"(?<referer>[^\"]*)") "(?<agent>[^\"]*)" (?<urt>[^\"]*).*/
time_format %d/%b/%Y:%H:%M:%S %z
keep_time_key true
types size:integer,reqtime:float,uct:float,uht:float,urt:float
</parse>
path /var/log/nginx/access.log
pos_file /tmp/fluent_nginx.pos
tag nginx
</source>
我的日志格式:
193.137.78.17 - - [07/Jan/2023:09:21:59 +0000] "GET /net/api/employee HTTP/1.1" 200 2323 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 0.014
193.137.78.17 - - [07/Jan/2023:09:22:00 +0000] "GET /net/api/employee HTTP/1.1" 200 2323 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 0.005
我已经在regex 101上测试了我的正则表达式,没有任何问题。但是,我在fluentd上得到了一个没有模式匹配的警告。我不明白为什么日志不能正确解析。
Jan 07 09:26:26 srv-api fluentd[14878]: 2023-01-07 09:26:26 +0000 [warn]: #0 no patterns matched tag="nginx"
有人能帮帮我吗?谢谢!
2条答案
按热度按时间sg24os4d1#
我认为您的问题是日志中的前导空格
您的模式要求
<remote>
前面没有空格,但是在日志中,远程IP前面有4个空格。在我看来,最简单的方法是在开头插入一个可选的变量-number-of-spaces。
工作原理
(
和)
只是为了让阅读代码的人更轻松:他们将看到在他们之间有一个空格字符,否则他们可能不会注意到。*
表示其中0个或多个。这允许匹配并丢弃行首的0个或多个空格。
顺便说一句
我注意到你有时用
\
来转义"
,有时不转义,这是有原因的吗?vngu2lb82#
您应该直接使用nginx parser plugin。
下面是使用sample input plugin和nginxparser插件的完整工作示例:
除此之外,我在regexp parser plugin中使用了正则表达式,它也工作得很好(尽管
types
字段中有冗余值):但是,消息中的错误
no patterns matched tag="nginx"
:这意味着在配置文件中没有对应的
match
节。必须有一个match
节,其中包含要处理或输出的相应tag
。示例:
fluentd