如何使用 FileBeat 从日志行设置字段
Posted
技术标签:
【中文标题】如何使用 FileBeat 从日志行设置字段【英文标题】:How to set fields from the log line with FileBeat 【发布时间】:2017-05-18 15:20:37 【问题描述】:在 Windows 服务器上,我有一个 FileBeat 进程,它获取我所有的 NCSA 日志(NCSA 格式的 HTTP 请求)并将它们发送到我们的 redis 数据库(用于 ELK 堆栈之后的缓冲区)。
我第一次执行 FileBeat 进程时,它把我的所有日志都发送到 Redis,完美,除了 @timestamp 设置在执行当天而不是日志本身(我有 6 个月历史)。 这在 Kibana 中看起来并不好,因为 6 个月的日志历史记录出现在同一时间(分钟)。
我每天有一个文件,我想知道是否可以在 filebeat 配置中从日志文件本身中提取时间戳以设置 @timestamp 以便每一行/文件都具有正确的时间?
日志行如下所示:
172.16.70.18 - - [03/Dec/2016:09:24:24 +0000] "GET /svc/product/v2/IDCDN8QH00?sid=mobile HTTP/1.1" 404 411 "-" "Jakarta Commons-HttpClient/3.1"
172.16.70.18 - - [03/Dec/2016:13:00:52 +0000] "GET /svc/asset/v2/560828?sid=mobile HTTP/1.1" 200 6670 "-" "Jakarta Commons-HttpClient/3.1"
172.16.82.232 - - [03/Dec/2016:15:15:55 +0000] "GET /svc/store/v1?sid=tutu&lang=en&lang=fr HTTP/1.1" 200 828 "-" "Apache-HttpClient/4.5.1 (Java/1.7.0_51)"
172.16.82.235 - - [02/Dec/2016:15:15:55 +0000] "GET /svc/asset/v1?sid=tutu&size=1 HTTP/1.1" 200 347 "-" "Apache-HttpClient/4.5.1 (Java/1.7.0_51)"
172.16.82.236 - - [02/Dec/2016:15:16:02 +0000] "GET /svc/product/v2?sid=tutu HTTP/1.1" 200 19226 "-" "Apache-HttpClient/4.5.1 (Java/1.7.0_51)"
172.16.82.237 - - [02/Dec/2016:15:16:14 +0000] "GET /svc/catalog/v2?sid=tutu HTTP/1.1" 200 223174 "-" "Apache-HttpClient/4.5.1 (Java/1.7.0_51)"
172.16.82.238 - - [02/Dec/2016:15:16:26 +0000] "GET /svc/store/v1?sid=tutu&lang=en&lang=fr HTTP/1.1" 200 3956 "-" "Apache-HttpClient/4.5.1 (Java/1.7.0_51)"
172.16.70.15 - - [01/Dec/2016:15:53:42 +0000] "GET /svc/product/v2/IDAB062200?sid=mobile HTTP/1.1" 200 5400 "-" "Jakarta Commons-HttpClient/3.1"
172.16.70.17 - - [01/Dec/2016:15:53:42 +0000] "GET /svc/product/v2/IDAB800851?sid=mobile HTTP/1.1" 200 3460 "-" "Jakarta Commons-HttpClient/3.1"
172.16.70.18 - - [01/Dec/2016:16:35:36 +0000] "GET /svc/product/v2/IDAB601071?sid=mobile HTTP/1.1" 404 400 "-" "Jakarta Commons-HttpClient/3.1"
172.16.70.18 - - [01/Dec/2016:16:35:36 +0000] "GET /svc/product/v2/IDCDN8QH00?sid=mobile HTTP/1.1" 401 400 "-" "Jakarta Commons-HttpClient/3.1"
另外我想知道我是否可以使用处理器来例如使用第一列的内容创建一个新字段“IP”。
我看到了 similar post,但它看起来只能与 ElasticSearch 直接集成。 我的 FileBeat 输出是 Redis。
【问题讨论】:
你用什么从 Redis 转到 Elasticsearch? 链 Redis -> LogStash -> ES -> Kibana 不在我的责任范围内,那我不能在那里改变任何东西。我只是想知道 FileBeat 是否可以在发送到 Redis DB 之前转换“键”。我认为另一种选择是在我的服务器上放置一个 LogStash 代理,这可能会解决我认为的问题。 【参考方案1】:Filebeat 唯一的解析能力是 JSON 日志。因此,如果您可以更改服务器以将数据写入 JSON 格式,则无需触及管道的其余部分(Redis -> Logstash -> Elasticsearch)即可完成此操作。
否则,您需要在将数据写入 Redis 之前使用 Logstash 进行解析。您可以运行 Filebeat -> Logstash -> Redis 或只运行 Logstash -> Redis。
或者,如果您可以修改上游 Logstash 配置,您可以在那里进行解析。
【讨论】:
好的,谢谢您的回答。最后,我与 Redis/ELK 堆栈的负责人交谈,我们得出结论,最好在受监控的服务器上保留 FileBeat,并在 Collector LogStash(Redis 之后的那个)上添加特定的grok filters
。 以上是关于如何使用 FileBeat 从日志行设置字段的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志
ELK日志系统:Filebeat使用及Kibana如何设置登录认证
多台NGINX服务器 ELK部署Filebeat的fields字段+Logstash的if 字段 采集多个日志文件写入elasticsearch 7.6.2 变更为不同索引名 自定义索引 index