我的编程空间,编程开发者的网络收藏夹
学习永远不晚

nginx(二)---Nginx 日志Log

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

nginx(二)---Nginx 日志Log

  1. 日志配置
  2. 日志轮转/切割
  3. 日志分析

1.日志配置

        1.1日志模块

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

日志模块的名称            ngx_http_log_module

        1.2相关指令

log_format         日志格式

access_log         访问日志
error_log          错误日志

open_log_file_cache          日志缓存

        1.3日志的格式和命令

        log_format

        (一)简介

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

        (二)语法

Syntax: log_format name [escape=default|json] string ...;
    name 表示格式名称
    string 表示定义的格式

         (三)默认值

Default: log_format combined "...";
    log_format 有默认的无需设置的combined日志格式,相当于apache的combined日志格式

        (四)网站代理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" ';

        (五)定义设置位置: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           状态:记录请求状态:

200   404   503   100   301

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

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

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

$http_x_forwarded_for    代理IP

old:

$request_length     请求的长度(包括请求行,请求头和请求正文)。
$request_time     请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601     ISO8601标准格式下的本地时间。
$bytes_sent     发送给客户端的总字节数    (可在主配置文件中,增加此项观c)
$msec     日志写入时间。单位为秒,精度是毫秒。

        (六)提示:总有一个404提示

       favicon.ico 文件是浏览器收藏网址时显示的图标,当第一次访问页面时,浏览器会自动发起请求获取页面的favicon.ico文件。当/favicon.ico文件不存在时,服务器会记录404日志。

   127.0.0.1 - - [26/Jul/2015:22:25:07 +0800] “GET /favicon.ico HTTP/1.1” 404 168 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0” “-”
    127.0.0.1 - - [26/Jul/2015:22:25:07 +0800] “GET /favicon.ico HTTP/1.1” 404 168 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0” “-“

        解决办法

当一个站点没有设置favicon.ico时,access.log会记录了大量favicon.ico 404信息。

这样有两个缺点:
1.使access.log文件变大,记录很多没有用的数据。
2.因为大部分是favicon.ico 404信息,当要查看信息时,会影响搜寻效率。

解决方法如下:
在nginx的配置中加入

location = /favicon.ico {
  log_not_found off;
  access_log off;
}
以上配置说明:
location = /favicon.ico 表示当访问/favicon.ico时,
log_not_found off 关闭日志
access_log off 不记录在access.log

完整配置如下:

server {
  listen        80;
  server_name   fdipzone.com;
  root          /Users/fdipzone/home;

  access_log /var/log/nginx/access.log main;
  error_log /var/log/nginx/error.log debug;

  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }

  location / {
    index  index.html index.htm index.php;
    include      /usr/local/etc/nginx/conf.d/php-fpm;
  }
}

        1.4访问日志和错误日志:access_log      error_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 客户端系统类型
    -远程客户端主机地址  

        1.5日志缓存

        (一)简介

大量访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭.占用了系统的IO,与业务无关。
可以使用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{}某一个页面的日志,进行缓存。

2.日志轮转/切割

        2.1概况

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

rpm  -ql nginx| grep log
    /etc/logrotate.d/nginx
    /var/log/nginx

        2.2观察日志轮转的含义

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

}

        2.3轮转语句

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

        2.4切割原理回顾

cron每小时呼唤一次anacron         vim /etc/cron.hourly/0anacron

anacrontab以天,周,月循环往复         vim /etc/anacrontab

天循环          vim /etc/cron.daily/logrotate

立刻循环    指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

anacron当天的时间戳    vim /var/spool/anacron/cron.daily
6.anacron循环后的时间戳            vim /var/lib/logrotate/logrotate.status

"/var/log/nginx/host.404.log" 2017-11-19-0:8:56
根据该时间确定是否轮转。

3.日志分析:准备好一份日志

        3.1常用字段

$remote_addr    $1             远程客户端地址
$time_local        $4              本机时间
$request           $7                请求URL
$status             $9                 状态码
$body_bytes_sent $10         请求体积

        3.2测试

        (一)统计2017年9月5日 PV量

grep '05/Sep/2017' cd.mobiletrain.org.log |wc -l

         8点-9点间的PV量

grep '05/Sep/2017:08' sz.mobiletrain.org.log  |wc -l

awk '$4>="[05/Sep/2017:08:00:00" && $4<="[05/Sep/2017:09:00:00" {print $0}'  sz.mobiletrain.org.log | wc -l

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

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10

        (三)统计2017年9月5日 访问大于100次的IP 

 grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100)  {print i,ips[i]}} } '| sort -k2 -rn | head -n10 

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

grep '05/Sep/2017' cd.mobiletrain.org.log |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10

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

grep '05/Sep/2017' sz.mobiletrain.org.log | awk '{ urls[$7]++; size[$7]+=$10} END{for(i in urls){print urls[i],size[i],i}}' | sort -k1 -rn | head -n10 

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

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ip_code[$1" "$9]++} END{ for(i in ip_code){ print i,ip_code[i] } }' | sort -k3 -rn | head -n10

 

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

 grep '05/Sep/2017' sz.mobiletrain.org.log | awk '{if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}'

         (八)统计前一分钟的PV量

date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);

awk  -v date=$date '$0 ~ date {i++}  END{print i}'  sz.mobiletrain.org.log

shell中的变量在awk程序中无法使用,因为在执行AWK时,是一个新的进程去处理的,因此就需要-v 来向awk程序中传参数了,你比如在shell程序中有一个变量a=15,你在awk程序中直接使用变量a是不行的,而你用awk -v b=a, 这样在AWK程序中就可以使用变量b了!也就相当于使用a了! 

# date=$(date -d '-1 minute' +%Y:%H:%M);  awk -v date=$date '$0 ~ date{i++}END{print i}' /var/log/nginx/xuleilinux.access.log 

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

awk '$4>="[05/Sep/2017:08:30:00" && $4<="[05/Sep/2017:09:00:00" {if($9=="404"){ip_code[$1" "$9]++}}END{for(i in ip_code){print i,ip_code[i]}}' sz.mobiletrain.org.log 

         (十)统计2017年9月5日 各种状态码数量

grep '05/Sep/2017' sz.mobiletrain.org.log  | awk '{code[$9]++} END{for(i in code){print i,code[i]}}'

         百分比

grep '05/Sep/2017' sz.mobiletrain.org.log | awk '{code[$9]++;total++} END{for(i in code){printf i" ";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'

 

来源地址:https://blog.csdn.net/qq_47800859/article/details/128795196

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

nginx(二)---Nginx 日志Log

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux Nginx 日志脚本

任务计划 crontab -l 1 15 * * * /home/dongnan/sh/split.sh >> /home/dongnan/sh/cron.log 2>& nginx 日志 ls /var/log/nginx/ 20130
2022-06-04

python分析nginx日志

利用python脚本分析nginx日志内容,默认统计ip、访问url、状态,可以通过修改脚本统计分析其他字段。一、脚本运行方式python count_log.py -f med.xxxx.com.access.log二、脚本内容#!/us
2023-01-31

python 正则分析nginx日志

有个需求要分析nginx日志,也懒得去研究logstach之类的开源工具,干脆直接写一个脚本,自己根据需求来实现:先看日志格式:我们跟别人的不太一样,所以没办法了:12.195.166.35 [10/May/2015:14:38:09 +0
2023-01-31

python分析nginx访问日志

Web服务器的各种系统管理工作包括了多Nginx/Apache 日志的统计,python使这个任务变得极其简单,下面分享两个小脚本。一、统计Nginx的客户端缓存的命中率需要检查你的Nginx服务器拒绝客户请求的频率,服务器拒绝的原因是因为
2023-01-31

python切割nginx日志脚本

#!/usr/bin/env python#-*-coding:utf-8-*-#Python nginx cut log 1import subprocessdef mkdir():        subprocess.call('mkd
2023-01-31

nginx切割日志脚本(python)

因为以前没有做nginx日志分割,有时候想看日志的时候总是发现有十几G的甚至上百G的日志文件,于是就想使用python写个nginx日志分割(当然你也可以使用shell来完成都是很简单)需求:1.按照日分割nginx所有日志2.由于日志不需
2023-01-31

nginx日志切割shell脚本

一、脚本思路第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。第二步向nginx主进程发送U
2022-06-04

Nginx日志格式如何配置

本篇内容主要讲解“Nginx日志格式如何配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nginx日志格式如何配置”吧!上线了一个小的预约程序,配置通过Nginx进行访问入口,默认的日志是没有
2023-07-05

python分析nginx日志的ip(来

#!/usr/bin/env python#_*_coding:utf-8 _*___author__ = 'gaogd'import datetime,threadingimport sys, os, urllib2, jsonreloa
2023-01-31

怎么将nginx日志导入elasticsearch

本篇内容主要讲解“怎么将nginx日志导入elasticsearch”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么将nginx日志导入elasticsearch”吧!将nginx日志通过fi
2023-06-05

nginx日志切割脚本分享

#!/bin/bashLogs_path="/data/Application/nginx/logs"Pid_path="/data/Application/nginx/nginx.pid"Month=`date +%Y-%m`Date=`
2022-06-04

nginx的access_log日志怎么设置

本文小编为大家详细介绍“nginx的access_log日志怎么设置”,内容详细,步骤清晰,细节处理妥当,希望这篇“nginx的access_log日志怎么设置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ngi
2023-06-27

Nginx日志指定时间段查询

Nginx出现报错,需要查看指定时间的日志,由于日志量太大,一行行搜索也很慢查看指定时间的日志 19:00~20:00cat access.log |awk -F "[ |/]" $6>="2017:19:00:00"&&$6<="2017
2023-01-30

nginx日志切割的脚本分享

这篇文章主要介绍“nginx日志切割的脚本分享”,在日常操作中,相信很多人在nginx日志切割的脚本分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx日志切割的脚本分享”的疑惑有所帮助!接下来,请跟
2023-06-09

编程热搜

目录