当前位置: 首页 > news >正文

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日志进行统计分析。这个脚本包括以下功能:

  1. 统计各种状态码的数量

  2. 统计访问最多的Referer

  3. 统计访问最高的URI

  4. 统计访问最多的IP和User-Agent

  5. 统计每分钟的请求数、流量、请求时间、状态码等

脚本代码实现

  1. 统计各种状态码的数量
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 状态码。

运行上述的命令,输出如下结果:

统计各种状态码的数量

  1. 统计访问最多的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  # 按出现次数降序排序

执行上述命令后,输出如下图的结果:

统计访问最多的Referer

  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  # 按出现次数降序排序 

执行上述命令后,输出如下图的结果:

统计访问最高的URI

  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

执行上述命令后,输出如下图的结果:

统计最多IP访问次数

  • 统计最多访问的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  # 按出现次数降序排序

执行上述命令后,输出如下图的结果:

统计访问统计访问

  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框架中优化应用程序流程的责任链设计模式(下)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&#xf…...

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完成&#xff0c;将源文件中的所有内容进行加密&#xff08;大写转小写、小写转大写&#xff09;后写入目标文件中 源文件内容不变 #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的区别 _ 统信 _ 麒麟 _ 中科方德

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

微软Win11 24H2最新可选更新补丁26100.1301来袭!

系统之家于7月31日发出最新报道&#xff0c;微软针对Win11 24H2用户推出七月最新的可选更新KB5040529&#xff0c;本次更新为开始菜单引入了全新的账号管理器&#xff0c;也改进了任务栏上的小组件图标。接下来跟随系统之家小编来看看本次更新的详细内容吧&#xff01;【推荐下…...

层次特征的尺度艺术:sklearn中的缩放技术

层次特征的尺度艺术&#xff1a;sklearn中的缩放技术 在机器学习中&#xff0c;特征缩放&#xff08;Feature Scaling&#xff09;是数据预处理的重要步骤&#xff0c;尤其对于基于距离的算法&#xff0c;如K-近邻&#xff08;KNN&#xff09;和支持向量机&#xff08;SVM&…...

Chapter 21 深入理解JSON

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

【C++高阶数据结构】红黑树:全面剖析与深度学习

目录 &#x1f680; 前言&#xff1a;红黑树与AVL树的比较一&#xff1a; &#x1f525; 红黑树的概念二&#xff1a; &#x1f525; 红黑树的性质 三&#xff1a; &#x1f525; 红黑树节点的定义和结构&#x1f680; 3.1 基本元素&#x1f680; 3.2 节点颜色&#x1f680; 3.…...

前端基于 axios 实现批量任务调度管理器 demo

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

Docker容器下面home assistant忘记账号密码怎么重置?

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

CTF-NSSCTF[GKCTF 2021]

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

MSA+抑郁症模型总结(一)(论文复现)

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

STM32智能农业灌溉系统教程

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

MySQL存储引擎和

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

Eclipse 主网向开发者开放

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

MAI-UI-8B入门:Node.js环境配置与自动化测试

MAI-UI-8B入门&#xff1a;Node.js环境配置与自动化测试 1. 开篇&#xff1a;为什么选择MAI-UI-8B进行自动化测试 如果你正在寻找一个能够真正理解图形界面、像真人一样操作应用的自动化测试方案&#xff0c;MAI-UI-8B绝对值得关注。这个由阿里通义实验室开源的GUI智能体模型…...

MusePublic圣光艺苑惊艳效果:大气照明+表达性纹理细节放大展示

MusePublic圣光艺苑惊艳效果&#xff1a;大气照明表达性纹理细节放大展示 1. 引言&#xff1a;当古典艺术遇见AI算力 想象一下&#xff0c;你走进一间19世纪的画室。空气中弥漫着亚麻籽油和矿物颜料的味道&#xff0c;阳光透过高窗洒在亚麻画布上&#xff0c;墙上挂着鎏金画框…...

HG-ha/MTools快速入门:3步部署,体验一体化桌面工具的魅力

HG-ha/MTools快速入门&#xff1a;3步部署&#xff0c;体验一体化桌面工具的魅力 1. 为什么选择MTools&#xff1f;——重新定义桌面生产力 现代开发者和创意工作者常常面临一个困境&#xff1a;需要在十几个专业软件之间来回切换&#xff0c;每个工具都有不同的操作逻辑和系…...

手把手教你学<基于 Linux 的 NPU 协处理器固件开发>专栏第1章 入门:

1.2 典型 AI 芯片架构:主核 Linux + NPU 协处理器 在上一节我们明确了NPU是依附于Linux主核的专用AI协处理器,属于主从配合的工作模式,这一节我们就深入拆解端侧AI芯片最主流的“Linux主核+NPU协处理器”异构架构。结合大家日常接触的代码仓库管理、编译脚本执行、固件烧录…...

【数据结构】树的定义、核心术语与关键性质全解析

在数据结构的世界里&#xff0c;树&#xff08;Tree&#xff09; 是一种极其重要的非线性结构&#xff0c;它完美模拟了自然界中树的层次关系&#xff0c;从文件系统、组织结构&#xff0c;到算法中的二叉搜索树、堆&#xff0c;再到 AI 中的决策树&#xff0c;树的身影无处不在…...

MediaPipe人脸检测避坑指南:如何优化检测精度与性能(含模型选择建议)

MediaPipe人脸检测实战优化&#xff1a;从参数调优到模型部署的完整指南 人脸检测作为计算机视觉的基础任务&#xff0c;其性能直接影响后续的面部分析效果。MediaPipe提供的轻量级解决方案在移动端和边缘设备上表现出色&#xff0c;但实际应用中常遇到误检、漏检或性能瓶颈问题…...

GPIO输出模式详解:推挽与开漏对比与应用

1. GPIO输出模式基础概念在嵌入式系统开发中&#xff0c;GPIO(General Purpose Input/Output)是最基础也是最常用的外设之一。作为硬件工程师&#xff0c;深入理解GPIO的不同工作模式对于电路设计和程序开发都至关重要。今天我们就来详细剖析GPIO的两种主要输出模式&#xff1a…...

DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱

DMA传输效率翻倍秘籍&#xff1a;深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱 实时信号处理系统的性能瓶颈往往出现在数据传输环节。当工程师面对高速ADC采集的海量数据时&#xff0c;DMA控制器的高效配置直接决定了系统能否实现理论上的吞吐量。本文将深入剖析TMS…...

Transformer 从0到1:长时依赖问题的本质——梯度消失与爆炸

# Transformer 从0到1&#xff1a;长时依赖问题的本质——梯度消失与爆炸## 引言&#xff1a;序列模型的困境在自然语言处理、语音识别、时间序列分析等领域&#xff0c;处理序列数据是核心任务。一个理想的序列模型&#xff0c;不仅需要捕捉局部的语法结构&#xff08;如主语和…...

皇后大学揭秘:AI机器人与人类程序员的代码审查大作战

当你写完一段代码&#xff0c;准备提交到项目中时&#xff0c;通常会有同事帮你检查一遍——这个过程叫做代码审查&#xff0c;就像文章发表前的编辑校对一样重要。不过现在情况有了变化&#xff1a;越来越多的AI机器人也开始参与代码审查工作&#xff0c;它们能自动发现bug、提…...