Grafana 展示精美的 nginx 访问日志图表
2022/02 作者:ihunter 0 次 0
---Nginx 日志字段配置
注意:请确保 nginx 使用该字段,Nginx Key 名称如果有修改,Logstash 和 Grafana 模板 需要根据自己 Nginx 字段来修改
log_formataka_logs '{"@timestamp":"$time_iso8601",' '"host":"$hostname",' '"server_ip":"$server_addr",' '"client_ip":"$remote_addr",' '"xff":"$http_x_forwarded_for",' '"domain":"$host",' '"url":"$uri",' '"referer":"$http_referer",' '"args":"$args",' '"upstreamtime":"$upstream_response_time",' '"responsetime":"$request_time",' '"request_method":"$request_method",' '"status":"$status",' '"size":"$body_bytes_sent",' '"request_body":"$request_body",' '"request_length":"$request_length",' '"protocol":"$server_protocol",' '"upstreamhost":"$upstream_addr",' '"file_dir":"$request_filename",' '"http_user_agent":"$http_user_agent"' '}';
---Filebeat 配置
Filebeat Version 7.10
#===========================Filebeatinputs============================= filebeat.inputs:#inputs 为复数,表名 type 可以有多个 -type:log#输入类型 access: enabled:true#启用这个 type 配置 #日志是 json 开启这个 json.keys_under_root:true#默认这个值是 FALSE 的,也就是我们的 json 日志解析后会被放在 json 键上。设为 TRUE,所有的 keys 就会被放到根节点 json.overwrite_keys:true#是否要覆盖原有的 key,这是关键配置,将 keys_under_root 设为 TRUE 后,再将 overwrite_keys 也设为 TRUE,就能把 filebeat 默认的 key 值给覆盖 max_bytes:20480#单条日志的大小限制,建议限制(默认为 10M,queue.mem.events*max_bytes将是占有内存的一部分) paths: -/var/log/nginx/access.log#监控 nginx的 access 日志 fields:#额外的字段 source:nginx-access#自定义 source 字段,用于 es 建议索引(字段名小写,我记得大写好像不行) #自定义 es 的索引需要把 ilm 设置为 false setup.ilm.enabled:false #--------------------------Kafkaoutput------------------------------ output.kafka:#输出到 kafka enabled:true#该 output 配置是否启用 hosts:["host1:9092","host2:9092","host3:9092"]#kafka 节点列表 topic:"elk-%{[fields.source]}"#kafka 会创建该 topic,然后 logstash(可以过滤修改)会传给 es 作为索引名称 partition.hash: reachable_only:true#是否只发往可达分区 compression:gzip#压缩 max_message_bytes:1000000# Event 最大字节数。默认 1000000。应小于等于 kafka broker message.max.bytes 值 required_acks:1#kafkaack 等级 worker:1#kafkaoutput 的最大并发数 bulk_max_size:2048#单次发往 kafka 的最大事件数 logging.to_files:true#输出所有日志到 file,默认 true,达到日志文件大小限制时,日志文件会自动限制替换,详细配置:https://www.cnblogs.com/qinwengang/p/10982424.html close_older:30m#如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件 handle。默认 1h force_close_files:false#这个选项关闭一个文件,当文件名称的变化。只在 window 建议为 true #没有新日志采集后多长时间关闭文件句柄,默认 5 分钟,设置成 1 分钟,加快文件句柄关闭 close_inactive:1m #传输了 3h 后没有传输完成的话就强行关闭文件句柄,这个配置项是解决以上案例问题的 key point close_timeout:3h #这个配置项也应该配置上,默认值是 0 表示不清理,不清理的意思是采集过的文件描述在 registry 文件里永不清理,在运行一段时间后,registry 会变大,可能会带来问题 clean_inactive:72h #设置了 clean_inactive 后就需要设置 ignore_older,且要保证 ignore_older---Logstash 配置
Logstash Version 7.10
-vim 01-input.conf
input{#输入组件 kafka{#从 kafka 消费数据 bootstrap_servers=>["host1:9092,host2:9092,host3:9092"] #topics=>"%{[@metadata][topic]}"#使用 kafka 传过来的 topic topics_pattern=>"elk-.*"#使用正则匹配 topic codec=>"json"#数据格式 consumer_threads=>3#消费线程数量 decorate_events=>true#可向事件添加 Kafka 元数据,比如主题、消息大小的选项,这将向 logstash 事件中添加一个名为 kafka 的字段 auto_offset_reset=>"latest"#自动重置偏移量到最新的偏移量 group_id=>"logstash-groups1"#消费组 ID,多个有相同 group_id 的 logstash 实例为一个消费组 client_id=>"logstash1"#客户端 ID fetch_max_wait_ms=>"1000"#指当没有足够的数据立即满足 fetch_min_bytes 时,服务器在回答 fetch 请求之前将阻塞的最长时间 } }-vim 02-output.conf
output{#输出组件 elasticsearch{ #Logstash 输出到 es hosts=>["host1:9200","host2:9200","host3:9200"] index=>"%{[fields][source]}-%{+YYYY-MM-dd}"#直接在日志中匹配,索引会去掉 elk user=>"elastic" password=>"xxxxxx" } #stdout{ #codec=>rubydebug #} }-vim 03-filter.conf
filter{ #因为 Nginx 前端有负载均衡,$remote_addr字段不是用户真实 ip 地址 #本例获取$http_x_forwarded_for字段,$http_x_forwarded_for字段第一个 ip 地址就是用户真实 ip 地址 #再 nginx 字段基础上添加real_remote_addr字段,用于存储用户真实 ip 地址 if([fields][source]=~"nginx-access"){ if","in[xff]{ mutate{ split=>["xff",","] add_field=>{"real_remote_addr"=>"%{[xff][0]}"} } }elseif([xff]=="-"){ mutate{ add_field=>{"real_remote_addr"=>"-"} } }else{ mutate{ add_field=>{"real_remote_addr"=>"%{xff}"} } } geoip{ target=>"geoip" source=>"real_remote_addr" database=>"/usr/share/logstash/data/GeoLite2-City/GeoLite2-City.mmdb" add_field=>["[geoip][coordinates]","%{[geoip][longitude]}"] add_field=>["[geoip][coordinates]","%{[geoip][latitude]}"] #去掉显示geoip显示的多余信息 remove_field=>["[geoip][latitude]","[geoip][longitude]","[geoip][country_code]","[geoip][country_code2]","[geoip][country_code3]","[geoip][timezone]","[geoip][continent_code]","[geoip][region_code]"] } mutate{ convert=>{ "[size]"=>"integer" "[status]"=>"integer" "[responsetime]"=>"float" "[upstreamtime]"=>"float" "[geoip][coordinates]"=>"float" } } #根据 http_user_agent 来自动处理区分用户客户端系统与版本 useragent{ source=>"http_user_agent" target=>"ua" #过滤 useragent 没用的字段 remove_field=>["[ua][minor]","[ua][major]","[ua][build]","[ua][patch]","[ua][os_minor]","[ua][os_major]"] } } }---Grafana Nginx 图表
注意:如果 Logstash 配置按照本文来配,需要 Grafana 图表中 client_ip 字段替换为 real_remote_addr 字段。
上篇: 手把手教你使用Nacos配置中心
下篇: nginx-配置