linux nginx日志管理分析

Nginx 日志Log

 

日志配置

cd /var/log/nginx/    //充放日志文件的目录(包括访问日志和错误日志)

日志模块

官方文档: http://nginx.org/en/docs/http/ngx_http_log_module.html

日志模块的名称: ngx_http_log_module

相关指令

log_format     日志格式

access_log     访问日志

error_log         错误日志

open_log_file_cache 日志缓存

open_log_file_cache  max=N [inactive=time]  [mim_uses=N]  [valid=time]  | off

该指令默认是禁止的,等同于: open_log_file_cache off;

open_log_file_cache 指令的各项参数说明如下:

max: 设置缓存中的最大文件描述符数量。如果超过设置的最大文件描述符数量,则采用  LRU (Least Recently Used) 算法清除"较不常使用的文件描述符"。  LRU (Least Recently Used) 算 法的基本概念是:当内存缓冲区剩余的可用空间不够时,缓冲区尽可能地先保留使用者最常使用 的数据,将最近未使用的数据移出内存,腾出空间来加载另外的数据。

inactive:  设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符。 此参数为可选参数,默认的时间为 10 秒钟。

min_uses: 在参数 inactive 指定的时间范围内,如果日志文件超过被使用的次数,则将该日 志文件的描述符记入缓存。默认次数为 1。

valid: 设置多长时间检查一次,看一看变量指定的日志文件路径与文件名是否仍然存在。默 认时间为 60秒。

off: 禁止使用缓存。

open_log_file_cache  指令的设置示例如下:

open_log_file_cache  max=1000  inactive=20s  min_uses=2  valid=1m;

 

日志的格式和命令(log_format)

简介:

Nginx有非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义。

语法:

Syntax: log_format name [escape=default|json] string ...;

name 表示格式名称

string 表示定义的格式

默认值:

Default: log_format combined "...";

log_format 有默认的无需设置的combined日志格式,相当于apache的combined日志格式

环境:

Context: http     context   网站 代理 LB 全局和局部

例如代理服务器的日志格式就不同

如果Nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址。$remote_addr获取的是反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。

nginx代理日志格式如下

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

 

定义设置位置

cat /var/log/nginx/access.log          充放日志位置

vim /etc/nginx/nginx.conf  日志部分配置

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

 '$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

日志格式允许包含的变量 (以上解释)

$remote_addr, 远程地址: 记录客户端IP地址

$remote_user 远程用户:记录客户端用户名称

[$time_local] 本地时间:服务器自身时间

$request  请求:记录请求的URL和HTTP协议

"GET /1.html HTTP/1.1"

"GET /index.html HTTP/1.1"

$status 状态:记录请求状态

$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小

$http_referer 记录从哪个页面链接访问过来的  (超链接)

$http_user_agent 记录客户端浏览器相关信息

$http_x_forwarded_for 代理IP

old(旧的)

$request_length 请求的长度(包括请求行,请求头和请求正文)。

$request_time       

请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$time_iso8601 ISO8601标准格式下的本地时间。

$bytes_sent

发送给客户端的总字节数    (可在主配置文件中,增加此项观c)

$msec                日志写入时间。单位为秒,精度是毫秒。

 

访问日志和错误日志

access_log   访问日志

error_log 错误日志

案例:access_log 某条日志记录

192.168.100.254 - - [17/Dec/2017:14:45:59 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.100.10/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"

某条日志记录含义

192.远程主机IP

- -   用户

【2017】时间

get获得,下载,还有post提交。

 /nginx-logo.png  下载图片

http版本

状态码 什么结果。对,还是错

368 大小

引用自哪个连接,主页http://192.168.100.10/

Mozilla 5.0浏览器的版本

Windows NT 客户端系统类型

-远程客户端主机地址  (请看注释)

error_log 个性化404

1 修改主配置文件

server{

        error_page 404 /404.html;

            location = /404.html {

            root            /xuleilinux;

        }

}

 systemctl restart nginx

2 创建错误反馈页面

vim /xuleilinux/404.html

3 访问

访问不存在的页面

4 查看404日志

观察404页面的现象。

 

日志缓存

简介:

大量访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。

可以使用open_log_file_cache来设(写入主配置文件)

Syntax:

open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m ;

max 1000 指的是日志文件的FD,最大的缓存数量为1000。超了怎么办,看下面

min_users 3    20秒内小于3次访问的FD,就给你清掉,结合inactive 20s 的时间。

valid  1m  检查周期为1分钟。

总结:缓存最多1000个,到了极限,每分钟开始清除掉  20秒内小于3次的文件FD.

Default:

open_log_file_cache off;   打开日志文件缓存关闭.

Context:

http, server, locatition

写入在中http{} 将整个服务器所有网站,所有页面的日志进行缓存

写入在中server{} 将某一个网站的所有页面日志,进行缓存

写入在中location{}某一个页面的日志,进行缓存。


日志轮转/切割

前言

Nginx安装,会默认启动日志轮转。

rpm  -ql nginx| grep log

 /etc/logrotate.d/nginx    //日志轮转

 /var/log/nginx    //充放日志

 

vim /etc/logrotate.d/nginx 默认的    

/var/log/nginx/*log { 待切割的日志

    create 0644 nginx nginx 创建新的日志文件,属主

    daily 每天轮转一次

    rotate 10 10份

    missingok 丢失不提示

    notifempty 空文件的话,不转储

    compress 压缩

    sharedscripts 轮转后脚本

    postrotate

        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true

USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

    endscript

   }

自建 /var/log/nginx/*.log {

     daily      每天轮转一次

     missingok     丢失不提醒

     rotate 52 保留多少份

     compress 压缩

     delaycompress 延时压缩

     notifempty 空文件的话 不轮转

     create 640 nginx adm 轮转后新建文件 设置权限

     sharedscripts 轮转后脚本

     postrotate

            if [ -f /var/run/nginx.pid ]; then

                kill -USR1 `cat /var/run/nginx.pid`

            fi

       endscript 脚本停止运行

  }

轮转语句:指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

 

切割原理回顾(扩展)

1.cron每小时呼唤一次anacron

vim /etc/cron.hourly/0anacron

2.anacrontab以天,周,月循环往复

vim /etc/anacrontab

3.天循环

vim /etc/cron.daily/logrotate

4.立刻循环

指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

5.anacron当天的时间戳

vim /var/spool/anacron/cron.daily

20180731

6.anacron循环后的时间戳

vim /var/lib/logrotate/logrotate.status

"/var/log/nginx/host.404.log" 2017-11-19-0:8:56

根据该时间确定是否轮转。

 

常用字段

$remote_addr       $1 远程客户端地址

$time_local         $4 本机时间

$request           $7 请求URL

$status            $9 状态码

$body_bytes_sent   $10 请求体积

 

案例样本 (参考以下脚本)

校内网wget ftp://10.18.40.100/solution/log.tar.gz

1. 统计2017年9月5日 PV量

2. 统计2017年9月5日 一天内访问最多的10个IP(ip top10)

3. 统计2017年9月5日 访问大于100次的IP

4. 统计2017年9月5日 访问最多的10个页面($request top 10)

5. 统计2017年9月5日 每个URL访问内容总大小($body_bytes_sent)

6. 统计2017年9月5日 每个IP访问状态码数量($status)

7. 统计2017年9月5日 IP访问状态码为404及出现次数($status)

8. 统计前一分钟的PV量

9. 统计2017年9月5日 8:30-9:00,每个IP,出现404状态码的数量

10. 统计2017年9月5日 各种状态码数量
 

cat << EOF

=============================================================

1.  一天内访问最多的10个IP(ip top10)

2.  访问大于100次的IP

3.  PV量总量

4.  访问最多的10个页面($request top 10)

5.  每个URL访问内容总大小($body_bytes_sent)

6.  IP访问状态码为404及出现次数($status)

7.  统计某天 每个IP访问状态码数量($status)

8.  统计前一分钟的PV量

9. 统计某天 各种状态码数量

===============================================================

EOF

read -p "输入查询的日志目录的位置: " b

read -p "输入查询的时间 格式:如 05/Sep/2017 : " a

read -p "输入选项:" n

case "$n" in

        1)

        echo "正在查询一天内访问最多的10个IP"

        sleep 1

        #一天内访问最多的10个IP(ip top10)

        grep $a $b | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10

        ;;

        2)

        echo " 访问大于100次的IP"

        #访问大于100次的IP

        grep $a $b | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100)  {print i,ips[i]}} } '| sort -k2 -rn | head -n10

        ;;

        3)

        echo "pv总量"

        #pv总量

        grep $a $b |wc -l

        ;;

        4)

        echo "访问最多的10个页面($request top 10)"

        #访问最多的10个页面($request top 10)

        grep $a $b |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10

        ;;

        5)

        echo "每个URL访问内容总大小($body_bytes_sent)"

        #每个URL访问内容总大小($body_bytes_sent)

        grep $a $b |awk '{ urls[$7]++; size[$7]+=$10}END{for(i in urls){print urls[i],size[i],i}}'|sort -k1 -rn | head -n10

        ;;

        6)

        echo "IP访问状态码为404及出现次数($status)"

        #IP访问状态码为404及出现次数($status)

        grep $a $b | awk '{if($9="404"){ip_code[$1" "$9]++}}END{for(i in ip_code){print i,ip_code[i]}}'

        ;;

        7)

        echo " 统计$a 每个IP访问状态码数量($status)"

        # 统计某天 每个IP访问状态码数量($status)

        grep $a $b | awk '{ ip_code[$1" "$9]++}END{ for(i in ip_code){print i,ip_code[i]} }' | sort -k1 -rn | head -n10

        ;;

        8)

        echo "统计前一分钟的PV量"

        #8. 统计前一分钟的PV量

        date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk  -v date=$date '$0 ~ date {i++} END{print i}'  $b

        ;;

        9)

        echo "统计$a 各种状态码数量"

        #统计某天 各种状态码数量

        grep $a $b  | awk '{code[$9]++} END{for(i in code){print i,code[i]}}'

        echo "统计$a 各种状态码数量 百分比形式"

        #统计某天 各种状态码数量

        grep $a $b | awk '{code[$9]++;total++} END{for(i in code){printf i" ";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'

        ;;

esac

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值