Nginx日志分析:编写Shell脚本进行全面日志统计

admin 2024年7月29日14:41:54评论38 views字数 2903阅读9分40秒阅读模式

 

大家好!我是一个热衷于分享IT技术的up主。在这个公众号里,我将为大家带来最新、最实用的技术干货,从编程语言到前沿科技,从软件开发到网络安全。希望通过我的分享,能够帮助更多的小伙伴提升技术水平,共同成长!欢迎关注,一起探索科技的魅力吧!

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

Nginx日志分析:编写Shell脚本进行全面日志统计

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 "%dt%.4ft%sn", Arry
展开收缩
, Arry
展开收缩
/ 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 "%dt%.4ft%sn", Arry
    展开收缩
    , Arry
    展开收缩
    / total, s
    :

    • 打印每个状态码的出现次数、占比和状态码本身。

    • Arry
      展开收缩
      是状态码 s 出现的次数。

    • Arry
      展开收缩
      / total
      是该状态码出现的比例(占总请求数的百分比)。

    • s 是状态码。

    • 输出格式为:出现次数t 比例t 状态码。

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

Nginx日志分析:编写Shell脚本进行全面日志统计
统计各种状态码的数量
  1. 统计访问最多的Referer
    awk -F" '
    {
    Arry[$4] += 1;  # 将每个引用的字段($4)出现的次数累加到数组Arry中
    total++;        # 记录总的日志行数
    }
    END {
    for (s in Arry) {  # 遍历数组Arry中的每个引用字段
        printf "%dt%.4ft%sn", Arry
展开收缩
, Arry
展开收缩
/ total, s # 打印每个引用字段的出现次数、占比和引用字段本身 } } ' $LOG_FILE | sort -nr -k 1,1 # 按出现次数降序排序

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

Nginx日志分析:编写Shell脚本进行全面日志统计
统计访问最多的Referer
  1. 统计访问最高的URI
    awk  '
    {
    Arry[$9] += 1;  # 将每个引用的字段($18)出现的次数累加到数组Arry中
    total++;        # 记录总的日志行数
    }
    END {
    for (s in Arry) {  # 遍历数组Arry中的每个引用字段
        printf "%dt%.4ft%sn", Arry
展开收缩
, Arry
展开收缩
/ total, s # 打印每个引用字段的出现次数、占比和引用字段本身 } } ' $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序

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

Nginx日志分析:编写Shell脚本进行全面日志统计
统计访问最高的URI
  1. 统计访问最多的IP和User-Agent
  • 统计最多IP访问次数
    awk '
    {
    Arry[$1] += 1;  # 将每个IP地址出现的次数累加到数组Arry中
    total++;        # 记录总的日志行数
    }
    END {
    for (s in Arry) {  # 遍历数组Arry中的每个IP地址
        printf "%dt%.4ft%sn", Arry
展开收缩
, Arry
展开收缩
/ total, s # 打印每个IP地址的出现次数、占比和IP地址本身 } } ' $LOG_FILE | sort -nr -k 1,1

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

Nginx日志分析:编写Shell脚本进行全面日志统计
统计最多IP访问次数
  • 统计最多访问的User-Agent
awk  '
    {
    Arry[$18] += 1;  # 将每个引用的字段($18)出现的次数累加到数组Arry中
    total++;        # 记录总的日志行数
    }
    END {
    for (s in Arry) {  # 遍历数组Arry中的每个引用字段
        printf "%dt%.4ft%sn", Arry
展开收缩
, Arry
展开收缩
/ total, s # 打印每个引用字段的出现次数、占比和引用字段本身 } } ' $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序

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

Nginx日志分析:编写Shell脚本进行全面日志统计
统计访问统计访问
  1. 统计每分钟的请求数、流量、请求时间、状态码等
awk -F '|' '
  BEGIN {
    printf "时间t数量t流量[MB]t请求时间t20xt30xt40xt50xt60xn"
  }
  {
    # 提取时间的分钟部分
    minute = substr($2, 12, 5)

    # 累计流量、请求数和请求时间
    tms[minute] += $13
    cnt[minute] += 1
    reqt[minute] += $15

    # 统计状态码
    status_code = $9
    if (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 "%st%dt%.4ft%.4ft%dt%dt%dt%dt%dn",
             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"

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

Nginx日志分析:编写Shell脚本进行全面日志统计

总结

通过上述Shell脚本,我们可以快速、全面地分析Nginx日志,了解网站的访问情况和性能表现。这不仅有助于我们发现潜在问题,还能为后续的优化工作提供有力的数据支持。在实际应用中,你可以根据自己的需求,进一步扩展和定制这个脚本。

脚本获取方式

上述脚本已经上传上传到gitee,有需要的小伙伴可以自行获取。gitee上的仓库主要是分享一些工作中常用的脚本。小伙伴可以frok或者watch仓库,这样有更新可以及时关注到。

Nginx日志分析:编写Shell脚本进行全面日志统计
脚本仓库
 

仓库地址:

https://gitee.com/didiplus/script

原文始发于微信公众号(攻城狮成长日记):Nginx日志分析:编写Shell脚本进行全面日志统计

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月29日14:41:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nginx日志分析:编写Shell脚本进行全面日志统计https://cn-sec.com/archives/3010502.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息