Grafana 展示精美的 nginx 访问日志图表

2022/02 作者:ihunter 0 0

Grafana 展示精美的 nginx 访问日志图表

---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 字段。


赞(2) 更多分享

上篇: 手把手教你使用Nacos配置中心
下篇: nginx-配置