使用filebeat解析nginx的json格式日志,并且保存原始message字段的值,输出到es中并通过grafana图形化显示
1.nginx日志调成json样式
log_format json '{"@timestamp":"$time_iso8601",'
'"server_addr":"$server_addr",'
'"server_name":"$server_name",'
'"server_port":"$server_port",'
'"server_protocol":"$server_protocol",'
'"client_ip":"$remote_addr",'
'"client_user":"$remote_user",'
'"status":"$status",'
'"request_method": "$request_method",'
'"request_length":"$request_length",'
'"request_time":"$request_time",'
'"request_url":"$request_uri",'
'"request_line":"$request",'
'"send_client_size":"$bytes_sent",'
'"send_client_body_size":"$body_bytes_sent",'
'"proxy_protocol_addr":"$proxy_protocol_addr",'
'"proxy_add_x_forward":"$proxy_add_x_forwarded_for",'
'"proxy_port":"$proxy_port",'
'"proxy_host":"$proxy_host",'
'"upstream_host":"$upstream_addr",'
'"upstream_status":"$upstream_status",'
'"upstream_cache_status":"$upstream_cache_status",'
'"upstream_connect_time":"$upstream_connect_time",'
'"upstream_response_time":"$upstream_response_time",'
'"upstream_header_time":"$upstream_header_time",'
'"upstream_cookie_name":"$upstream_cookie_name",'
'"upstream_response_length":"$upstream_response_length",'
'"upstream_bytes_received":"$upstream_bytes_received",'
'"upstream_bytes_sent":"$upstream_bytes_sent",'
'"http_host":"$host",'
'"http_cookie":"$http_cooke",'
'"http_user_agent":"$http_user_agent",'
'"http_origin":"$http_origin",'
'"http_upgrade":"$http_upgrade",'
'"http_referer":"$http_referer",'
'"http_x_forward":"$http_x_forwarded_for",'
'"http_x_forwarded_proto":"$http_x_forwarded_proto",'
'"https":"$https",'
'"http_scheme":"$scheme",'
'"invalid_referer":"$invalid_referer",'
'"gzip_ratio":"$gzip_ratio",'
'"realpath_root":"$realpath_root",'
'"document_root":"$document_root",'
'"is_args":"$is_args",'
'"args":"$args",'
'"connection_requests":"$connection_requests",'
'"connection_number":"$connection",'
'"ssl_protocol":"$ssl_protocol",'
'"ssl_cipher":"$ssl_cipher"}';
凡是需要使用nginx日志的均采用如下写法:
# 事前创建保存nginx日志的文件夹
# mkdir -p /var/log/nginx/
access_log /var/log/nginx/test.access.log json;
2.使用filebeat收集nginx的日志
注意:这里不采用自带的模块形式,也就是不开启nginx的module收集功能
注意:方式1和方式2的其他配置都相同,这里只列出不同的地方,后面会具体分析这俩不同的配置有啥不同的效果
设置方式1
- type: log
enabled: true
paths:
- /var/log/nginx/test.access.log
fields:
log_source: nginx
log_type: www
fields_under_root: true
tags: ["nginx"]
json:
keys_under_root: true
overwrite_keys: true
message_key: "message"
add_error_key: true
使用方式1的设置后,nginx的日志就会输出到es中,且日志中的每个键值对就是顶级字段,如下图所示

但是有一个问题,原有message字段的值是空的,导致在kibana日志导航中无法显示ngixn的日志(具体是access日志,error日志因为还是原来的设置仍会显示).
这种设置在grafana中会正常显示数据出来的。
设置方式2
- type: log
enabled: true
paths:
- /var/log/nginx/test.access.log
fields:
log_source: nginx
log_type: www
fields_under_root: true
tags: ["nginx"]
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- decode_json_fields:
fields: ['message']
target: ""
overwrite_keys: false
process_array: false
max_depth: 1
使用方式2的设置后,nginx的日志就会输出到es中,且日志中的每个键值对就是顶级字段,并且原有message字段的值仍存在,在kibana日志导航中还可以继续显示ngixn的日志(具体是access日志,error日志因为还是原来的设置仍会显示).

这种设置在grafana中会正常显示数据出来的。
综合方式1和方式2,方式2的方式是符合需求的,既能继续查询日志,还能把日志信息图形化显示出来(不使用自带的nginx module收集方式)
3.es中设置索引模式
注意:若索引模式不是filebeat开头的,则在grafana中不会显示出数据来
filebeat-*
4.grafana中添加dashboard
打开 Grafana 页面,登录后,在 Data Sources 添加类型为 Elasticsearch 的数据源
在 HTTP 段,把 es 机器的IP地址和端口填写到 URL 输入框中,比如: http://localhost:9200,访问有密码的话需要加上密码
在 Elasticsearch details 段
把上面 filebeat 配置的nginx索引名称填写到 Index name 输入框中,比如: filebeat-*
Version 选择 7.0+
保存测试
导入Dashboard,ID: 14913
报错:Panel plugin not found: grafana-piechart-panel
解决办法:
grafana-cli plugins install grafana-piechart-panel
systemctl restart grafana-server


6.上述方式1和方式2的字段含义
方式1
json 这些选项使得Filebeat将日志作为JSON消息来解析。例如:
json.keys_under_root: true
json.add_error_key: true
json.message_key: log
为了启用JSON解析模式,你必须至少指定下列设置项中的一个:
keys_under_root: 默认情况下,解码后的JSON被放置在一个以"json"为key的输出文档中。如果你启用这个设置,那么这个key在文档中被复制为顶级。默认是false。
overwrite_keys: 如果keys_under_root被启用,那么在key冲突的情况下,解码后的JSON对象将覆盖Filebeat正常的字段
add_error_key: 如果启用,则当JSON反编排出现错误的时候Filebeat添加 "error.message" 和 "error.type: json"两个key,或者当没有使用message_key的时候。
message_key: 一个可选的配置,用于在应用行过滤和多行设置的时候指定一个JSON key。指定的这个key必须在JSON对象中是顶级的,而且其关联的值必须是一个字符串,否则没有过滤或者多行聚集发送。
ignore_decoding_error: 一个可选的配置,用于指定是否JSON解码错误应该被记录到日志中。如果设为true,错误将被记录。默认是false。
方式2
用filebeat想对收集到的日志进行这样的解析:如果为json的话,就将json对象中的每个子字段解析成顶级结构下的一个字段,但是发现,解析后,保存日志完整内容的message字段(也即完整的json串)消失了,最终找到如下解决方法:
用processors中的decode_json_fields处理器进行处理,它类似logstash中的filter,具体格式如下:
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- decode_json_fields:
fields: ['message'] #要进行解析的字段
target: "" #json内容解析到指定的字段,如果为空(""),则解析到顶级结构下
overwrite_keys: false #如果解析出的json结构中某个字段在原始的event(在filebeat中传输的一条数据为一个event)中也存在,是否覆盖event中该字段的值,默认值:false
process_array: false #数组是否解码,默认值:false
max_depth: 1 #解码深度,默认值:1
使用filebeat解析nginx的json格式日志,并且保存原始message字段的值,输出到es中并通过grafana图形化显示的更多相关文章
- filebeat收集nginx的json格式日志
一.在nginx主机上安装filebeat组件 [root@zabbix_server nginx]# cd /usr/local/src/ [root@zabbix_server src]# wge ...
- 收集Nginx的json格式日志(五)
一.配置nginx [root@linux-node1 ~]# vim /etc/nginx/nginx.conf #修改日志格式为json格式,并创建一个nginxweb的网站目录 log_form ...
- Logstash动态模板映射收集Nginx的Json格式日志
Logstash传输给ES的数据会自动映射为5索引,5备份,字段都为text的的索引.这样基本上无法进行数据分析.所以必须将Logstash的数据按照既定的格式存储在ES中,这时候就要使用到ES模板技 ...
- ELK之收集Nginx、Tomcat的json格式日志
1.安装Nginx yum -y install nginx vim /etc/nginx/nginx.conf # 修改日志格式为json格式,并创建一个nginxweb的网站目录 log_form ...
- Nginx 高级配置-自定义json格式日志
Nginx 高级配置-自定义json格式日志 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据运维工作中,我们经常会使用flume,filebeat相关日志收集工具取收集日志 ...
- JAVA代码解析String字符串(json格式的)
java解析String字符串(json格式) 需要jar包:json-lib-2.4-jdk15.jar 一. String str = "{\"name\":\&qu ...
- java保存json格式数据,保存字符串和读取字符串
1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...
- Docker安装ELK并实现JSON格式日志分析
ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...
- Maven项目配置Logback输出JSON格式日志
最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析. 项目背景 项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash. 下面为pom ...
随机推荐
- Leetcode 1331. 数组序号转换
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号. 序号代表了一个元素有多大.序号编号的规则如下: 序号从 1 开始编号. 一个元素越大,那么序号越大.如果两个元素相等,那么它 ...
- 【CSP-J 2021】总结
前言:程不在长,能过则行.码不在多,无虫则灵.斯是信竞,惟吾爆零.线段维护快,树状跳的勤.数论剩余系,图论前向星.无数竞之推理,无物竞之劳形.大佬楼教主,超奆姚期智,神犇云:您太强了. 早上5:00就 ...
- 虚拟机win7系统安装
win7 x64虚拟机安装步骤 1.点击创建新虚拟机,选择典型 2.选择客户机操作系统:windows 7 x64 3.命名虚拟机 4.指定磁盘容量 5.点击完成 6.编辑此虚拟机设置 7.内存设置 ...
- CD 从抓轨到搭建流媒体服务器 —— 以《月临寐乡》为例
2022-07-19 v0.0.1 由于某些原因,进了 Static World 的群并入坑了 月临寐乡 ,梦开始了.作为幻想乡的新人,也算是有了自己喜欢的社团.但是更细节的东西,狐狐脑子一下子塞不下 ...
- Javascript之我也来手写一下Promise
Promise太重要了,可以说是改变了JavaScript开发体验重要内容之一.而Promise也可以说是现代Javascript中极为重要的核心概念,所以理解Promise/A+规范,理解Promi ...
- SQL语言的总结
SQL语言分类:1.数据查询语言(DQL:Data Query Language),也称为"数据检索语句",用以从表中查询获得数据,常用关键字SELECT (一般常用的语句是:SE ...
- Fibonacci Nim
目录 题意 题解 相关 Ref 题意 [COCI2010-2011#4] HRPA 取石子,但是: 先手第一次可取任意多个石子 此外每次可取的石子的个数,至少为 \(1\) ,至多为上一轮对方所取个数 ...
- 不安装运行时运行.NET程序
好久没写文章了,有些同学问我公众号是不是废了?其实并没有.其实想写的东西很多很多,主要是最近公司比较忙,以及一些其他个人原因没有时间来更新文章.这几天抽空写了一点点东西,证明公众号还活着. 长久以来的 ...
- 技术分享|MySQL caching_sha2_password认证异常问题分析
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 0. 导读 相同的账号.密码,手动客户端连接可以成功,通过MySQL Conne ...
- 《Python高手之路 第3版》这不是一本常规意义上Python的入门书!!
<Python高手之路 第3版>|免费下载地址 作者简介 · · · · · · Julien Danjou 具有12年从业经验的自由软件黑客.拥有多个开源社区的不同身份:Debian开 ...