Nginx日志分析:编写Shell脚本进行全面日志统计
Nginx
是一个高性能的HTTP
和反向代理服务器,也是一个IMAP/POP3/SMTP
代理服务器。无论是在大流量的网站还是小型的个人博客中,Nginx
都得到了广泛应用。在实际生产环境中,对Nginx
日志的分析有助于我们了解网站的访问情况,发现潜在问题并进行优化。本文将通过编写Shell脚本,实现对Nginx
日志的全面统计分析。
Nginx日志格式
首先,我们需要确保Nginx日志格式与以下格式类似:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
假设我们的日志文件名为access.log
。
Shell脚本实现
接下来,我们编写一个Shell脚本,对Nginx
日志进行统计分析。这个脚本包括以下功能:
-
统计各种状态码的数量
-
统计访问最多的
Referer
-
统计访问最高的
URI
-
统计访问最多的IP和
User-Agent
-
统计每分钟的请求数、流量、请求时间、状态码等
脚本代码实现
- 统计各种状态码的数量
awk '
{Arry[$12] += 1; total++;
}
END {for (s in Arry) {printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s}
}
' $LOG_FILE | sort -nr -k 1,1
Arry[$9] += 1;
:
$12
是日志文件的第十二个字段,通常表示 HTTP 状态码。
Arry
是一个关联数组,以 HTTP 状态码为键,将每个状态码出现的次数累加到数组Arry
中。
Arry[$9] += 1;
表示状态码$9
出现的次数加 1。
total++;
:
- 记录总的日志行数。
for (s in Arry)
:
- 遍历数组
Arry
中的每个状态码s
。
printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s
:
打印每个状态码的出现次数、占比和状态码本身。
Arry[s]
是状态码s
出现的次数。
Arry[s] / total
是该状态码出现的比例(占总请求数的百分比)。
s
是状态码。输出格式为:出现次数
\t
比例\t
状态码。
运行上述的命令,输出如下结果:
- 统计访问最多的
Referer
awk -F\" '{Arry[$4] += 1; # 将每个引用的字段($4)出现的次数累加到数组Arry中total++; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}}' $LOG_FILE | sort -nr -k 1,1 # 按出现次数降序排序
执行上述命令后,输出如下图的结果:
- 统计访问最高的
URI
awk '{Arry[$9] += 1; # 将每个引用的字段($18)出现的次数累加到数组Arry中total++; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}}' $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序
执行上述命令后,输出如下图的结果:
- 统计访问最多的IP和
User-Agent
- 统计最多IP访问次数
awk '{Arry[$1] += 1; # 将每个IP地址出现的次数累加到数组Arry中total++; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个IP地址printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s # 打印每个IP地址的出现次数、占比和IP地址本身}}' $LOG_FILE | sort -nr -k 1,1
执行上述命令后,输出如下图的结果:
- 统计最多访问的
User-Agent
awk '{Arry[$18] += 1; # 将每个引用的字段($18)出现的次数累加到数组Arry中total++; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf "%d\t%.4f\t%s\n", Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}}' $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序
执行上述命令后,输出如下图的结果:
- 统计每分钟的请求数、流量、请求时间、状态码等
awk -F '|' 'BEGIN {printf "时间\t数量\t流量[MB]\t请求时间\t20x\t30x\t40x\t50x\t60x\n"}{# 提取时间的分钟部分minute = substr($2, 12, 5)# 累计流量、请求数和请求时间tms[minute] += $13cnt[minute] += 1reqt[minute] += $15# 统计状态码status_code = $9if (status_code ~ /^2/) { sc20x[minute]++ }else if (status_code ~ /^3/) { sc30x[minute]++ }else if (status_code ~ /^4/) { sc40x[minute]++ }else if (status_code ~ /^5/) { sc50x[minute]++ }else { sc60x[minute]++ }}END {for (t in tms) {printf "%s\t%d\t%.4f\t%.4f\t%d\t%d\t%d\t%d\t%d\n",t,cnt[t],tms[t] / 1024 / 1024,(cnt[t] > 0 ? reqt[t] / cnt[t] : 0),sc20x[t],sc30x[t],sc40x[t],sc50x[t],sc60x[t]}}' "$LOG_FILE"
执行上述命令后,输出如下结果:
总结
通过上述Shell脚本,我们可以快速、全面地分析Nginx日志,了解网站的访问情况和性能表现。这不仅有助于我们发现潜在问题,还能为后续的优化工作提供有力的数据支持。在实际应用中,你可以根据自己的需求,进一步扩展和定制这个脚本。
脚本获取方式
上述脚本已经上传上传到gitee
,有需要的小伙伴可以自行获取。gitee上的仓库主要是分享一些工作中常用的脚本。小伙伴可以frok或者watch仓库,这样有更新可以及时关注到。
仓库地址:
https://gitee.com/didiplus/script
推荐阅读
- 不再担心数据丢失:用rsync打造你的自动化备份解决方案
- IP地址乱成一团?用Shell一键搞定!
- 实用技巧,用lsof命令监控tar文件解压进度,简单有效
- 运维必备:批量实现Linux机器SSH免密登录的自动化脚本
- 运维小妙招:如何让系统信息随登录自动展现?
相关文章:

Nginx日志分析:编写Shell脚本进行全面日志统计
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。无论是在大流量的网站还是小型的个人博客中,Nginx都得到了广泛应用。在实际生产环境中,对Nginx日志的分析有助于我们了解网站的访问情况,发现潜在问题…...

【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)
【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下) 大家好 我是寸铁👊 【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分…...

C语言——运算符及表达式
C语言——运算符及表达式 运算符运算符的分类(自增运算符)、--(自减运算符)赋值运算符逗号运算符(顺序求值运算符) 表达式 运算符 运算符的分类 C语言的运算符范围很宽,除了控制语句和输入输出…...

Python面试宝典第23题:分发糖果
题目 n 个孩子站成一排,给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果。 (1)每个孩子至少分配到 1 个糖果。 (2)相邻两个孩子评分更高的孩子会获得更多的糖果。 请…...

Java与模式及其应用场景知识点分享(电子版)
前言 Java 编程语言自1995年问世以来,其成功好像任何编程语言都无法媲美。生逢其时(互联网的兴起)固然是一方面的原因,而Java吸收总结了前人的经验教训,反映了最新技术(the state ofthe art),对其受到欢迎和采用,恐怕…...
软考高级第四版备考--第36天(审计内容)
IT内部控制审计:IT内部控制审计主要包括组织层面IT控制审计、IT一般控制审计及应用控制审计 IT专项审计:IT专项审计主要包括信息系统生命周期审计、信息系统开发过程审计、信息系统运行维护审计、网络与信息安全审计、信息系统项目审计、数据审计...

文件IO相关作业
1> 使用文件IO完成,将源文件中的所有内容进行加密(大写转小写、小写转大写)后写入目标文件中 源文件内容不变 #include<myhead.h>int main(int argc, const char *argv[]) {//判断传入的是否是两个文件if(argc!3){write(2,"inp…...
vue3 watch监听 父子组件通信
目录 01 watch监听方式 02 父子组件的通信 01 watch监听方式 1.watch(被监听的变量,(新值,旧值)>{ }) 默认直接就是深层监听 如果想要配置深度监听和默认触发 需要在第三个参数定义options对象 2.watch(被监听的变量,()>{},{ deep:true, immediate:true 项目打开后就执…...

【信创】adduser与useradd的区别 _ 统信 _ 麒麟 _ 中科方德
原文链接:【信创】adduser与useradd的区别 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇关于在信创终端操作系统上adduser和useradd命令区别的文章。adduser和useradd都是用于在Linux系统上添加用户的命令,但它们…...

微软Win11 24H2最新可选更新补丁26100.1301来袭!
系统之家于7月31日发出最新报道,微软针对Win11 24H2用户推出七月最新的可选更新KB5040529,本次更新为开始菜单引入了全新的账号管理器,也改进了任务栏上的小组件图标。接下来跟随系统之家小编来看看本次更新的详细内容吧!【推荐下…...
层次特征的尺度艺术:sklearn中的缩放技术
层次特征的尺度艺术:sklearn中的缩放技术 在机器学习中,特征缩放(Feature Scaling)是数据预处理的重要步骤,尤其对于基于距离的算法,如K-近邻(KNN)和支持向量机(SVM&…...

Chapter 21 深入理解JSON
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、JSON数据格式1. 什么是JSON?2. JSON数据的格式 二、JSON格式数据转化三、格式化JSON数据的在线工具 前言 在当今数据驱动的世界中,JSON&…...

【C++高阶数据结构】红黑树:全面剖析与深度学习
目录 🚀 前言:红黑树与AVL树的比较一: 🔥 红黑树的概念二: 🔥 红黑树的性质 三: 🔥 红黑树节点的定义和结构🚀 3.1 基本元素🚀 3.2 节点颜色🚀 3.…...

前端基于 axios 实现批量任务调度管理器 demo
一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求,并确保所有请求都能正确处理并报告其状态。 假设有一个场景:有一个任务列表,有单个任务的处理功能…...

Docker容器下面home assistant忘记账号密码怎么重置?
环境: docker ha 问题描述: Docker容器下面home assistant忘记账号密码怎么重置? 解决方案: 你可以按照以下步骤来找回或重置密码: 方法一 (未解决) 停止并删除当前的Home Assistant容器(确保你已经保…...

CTF-NSSCTF[GKCTF 2021]
[GKCTF 2021]easycms 考察: 用扫描工具扫描目录,扫描到后台登录界面/admin.php 题目提示了密码是五位弱口令,试了试弱口令admin和12345直接成功了 任意文件下载 点击设计-->主题然后随便选择一个主题,点击自定义࿰…...

MSA+抑郁症模型总结(一)(论文复现)
MSA抑郁症模型总结(一)(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结(一)(论文复现)情感分析在多场景的应用一、概述二、论文地址三、研究背景四…...

STM32智能农业灌溉系统教程
目录 引言环境准备智能农业灌溉系统基础代码实现:实现智能农业灌溉系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:农业监测与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系统通…...

MySQL存储引擎和
MySQL存储引擎 在数据库中保存的是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库。而在设计表的时候,最关注的一个问题是使用什么存储引擎。MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种…...

Eclipse 主网向开发者开放
摘要:Eclipse 基金会宣布,Eclipse 主网已经向开发者开放。在接下来几周的时间里,Eclipse 将邀请开发者在主网上部署项目,并参加黑客马拉松活动——“Total Eclipse Challenge”。 Eclipse 是首个基于以太坊的 SVM Layer2 方案&am…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...