一、nginx访问日志介绍

nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责,对应的官方地址为:http://nginx.org/en/docs/http/ngx_http_log_module.html.

二、访问日志参数

nginx的访问日志主要有以下2个参数控制

log_format        用来定义记录日志的格式(可以定义多种日志格式,取不同的名字即可)
access_log 用来指定日志文件的路径及使用何种日志格式记录日志

nginx日志格式中默认的参数配置如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

nginx记录日志的默认参数配置如下:

access_log  logs/access.log  main;

三、访问日志配置说明

日志格式的定义说明

语法如下:

定义语法    log_format name string ...;

其配置位置在http标签内。

日志格式说明如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

其中,log_format为日志格式关键参数,不能变。

main是为日志格式指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息,所有的日志段以空格分割,一行可以记录多个。不同列的意义如下:

$remote_addr          记录访问网站的客户端地址;

$http_x_forwarded_for      当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置;

$remote_user          远程客户端用户名称;

$time_local          记录访问时间与时区;

$request            用户的http请求起始行信息;

$status            http状态码,记录请求返回的状态,例如200、404、301等;

$body_bytes_sent      服务器发给客户端的响应body字节数;

$http_referer       记录此次请求是从哪个链接访问呢过来的,可以根据referer进行防盗链设置;

$http_user_agent       记录客户端访问信息,例如:浏览器、手机客户端等;

在没有特殊要求的情况下,采用默认的配置即可,更多可以设置的记录日志信息的变量见:http://nginx.org/en/docs/http/ngx_http_log_module.html

记录日志的access_log参数说明

下面是有关access_log参数的官方说明:

语法如下:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];

access_log syslog:server=address[,parameter=value] [format [if=condition]];

buffer=size 为存放日志的缓冲区大小,flush=time 为将缓冲区的日志刷到磁盘的时间,gzip[=level] 表示压缩级别,[if=condition] 表示其他条件,一般场景这些参数都无需配置,极端优化时才可能考虑这些参数。

access_log off中的off,表示不记录访问日志

默认配置:access_log logs/access.log combined;

放置位置在:http, server, location, if in location, limit_except中。

四、访问日志配置实战

编辑主配置文件nginx.conf,配置日志的格式如下:

[root@nginx conf]# sed -n '21,23 s/#//gp' nginx.conf.default
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

把上述内容放到nginx.conf 的 http 标签的首部,如下:

[root@nginx conf]# cat nginx.conf
worker_processes 1;
error_log logs/error.log error;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; sendfile on;
keepalive_timeout 65;
include extra/dmtest1.conf;
include extra/dmtest2.conf;
include extra/dmtest3.conf;
}

然后在每个虚拟主机里进行配置,使其使用上述格式记录用户访问日志。以 www.dmtest1.com 站点为例,命令如下:

[root@nginx conf]# cat extra/dmtest1.conf
server {
listen 80;
server_name www.dmtest1.com dmtest1.com;
location / {
root html/dmtest1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
access_log logs/access_dmtest1.log main;
}

如果不指定日志格式就会采用默认的combined格式记录日志。

检查语法重新加载配置文件:

[root@nginx conf]# ../sbin/nginx -t
nginx: the configuration file /application/nginx-1.8.1/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.8.1/conf/nginx.conf test is successful [root@nginx conf]# systemctl reload nginx

用浏览器模拟用户访问生成日志,在服务器上查看日志结果,如下:

[root@nginx conf]# curl www.dmtest1.com
www.dmtest1.com [root@nginx conf]# ls -l ../logs/access_dmtest1.log
-rw-r--r-- 1 root root 95 8月 27 06:24 ../logs/access_dmtest1.log [root@nginx conf]# tail -1 ../logs/access_dmtest1.log
192.168.200.102 - - [27/Aug/2018:06:24:36 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0" "-"

使用谷歌浏览器访问的日志结果如下:

[root@nginx conf]# tail -10  ../logs/access_dmtest1.log
192.168.200.1 - - [27/Aug/2018:06:36:58 +0800] "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"

日志格式和日志内容对应说明如下:

$remote_addr	对应的是真实日志里的192.168.200.1,即客户端的IP。

$remote_user	对应的是第二个中杠"-",没有远程用户,所以用"-"填充。

[$time_local	对应的是[27/Aug/2018:06:36:58 +0800]。

"$request"	对应的是"GET/HTTP/1.1"。

$tatus	对应的是200状态码,200表示正常访问。

$body_bytes_sent	对应的是16字节,即响应body的大小。

"$http_referer"		对应的是"-",由于是直接打开域名浏览的,因此,referer没有值。

$http_user_agent	对应的是"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

"$http_x_forwarded_for"	对应的是"-",因为web服务没有使用代理,因此此处为"-"

下面针对日志配置进行深入说明。

可以在记录日志参数中加上buffer和flush选项,这样可以在高并发场景下提升网站访问性能。加该选项的命令如下:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];

access_log syslog:server=address[,parameter=value] [format [if=condition]];

access_log off;

具体配置如下:

[root@nginx conf]# cat extra/dmtest1.conf
server {
listen 80;
server_name www.dmtest1.com dmtest1.com;
location / {
root html/dmtest1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#access_log logs/access_dmtest1.log main;
access_log logs/access_dmtest1.log main gzip buffer=32k flush=5s;
#access_log off;
}

五、nginx访问日志轮训切割

默认情况下nginx会把所有的访问日志生成到一个指定的访问日志文件access_log里,但这样一来,时间长了就会导致日志文件很大,不利于日志的分析和处理,因此,有必要对nginx日志按天或小时进行切割,使其分成不同的文件保存。这里使用按天切割的方法。

具体切割脚本如下:

[root@nginx shell]# cat cut_nginx_log.sh
#!/bin/bash
#Author:Mr.Ding
#Created Time:2018-08-27 07:19:30
#Name:cut_nginx_log.sh
#Description:
Dateformat=`date +%Y%m%d`
Basedir="/application/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_dmtest1"
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
#$Basedir/sbin/nginx -s reload
systemctl reload nginx

脚本实现切割nginx的思想为将正在写入的nginx日志(access_dmtest1.log)改名为带日期的格式文件(20180827_access_dmtest1.log),然后平滑重新加载nginx,生成新的nginx日志(access_dmtest1.log)。

把脚本加入计划任务:

[root@nginx shell]# cat >>/var/spool/cron/root << EOF
> #cut ngixn access log by dm 2018-8-27
> 00 00 * * * /bin/sh /server/scripts/shell/cut_nginx_log.sh >/dev/null 2&1
> EOF
[root@nginx shell]# crontab -l
#time sync by dm at 2018-8-20
*/5 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null 2>$1
#cut ngixn access log by dm 2018-8-27
00 00 * * * /bin/sh /server/scripts/shell/cut_nginx_log.sh >/dev/null 2&1

最终日志切割效果如下:

[root@nginx logs]# ll
总用量 32
-rw-r--r-- 1 root root 0 8月 27 07:35 20180827_access_dmtest1.log
-rw-r--r-- 1 root root 0 8月 27 07:35 access_dmtest1.log
-rw-r--r-- 1 root root 14076 8月 27 04:41 access.log
-rw-r--r-- 1 root root 10098 8月 27 06:36 error.log
-rw-r--r-- 1 root root 5 8月 26 21:56 nginx.pid

nginx访问日志(access_log)的更多相关文章

  1. nginx访问日志access_log

    在 nginx.conf 配置文件 http{} 方法体的括号内,增加或者打开以下代码注释: log_format main '$remote_addr - $remote_user [$time_l ...

  2. Nginx 访问日志轮询切割

    Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...

  3. logstash收集nginx访问日志

    logstash收集nginx访问日志 安装nginx #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org ...

  4. Nginx 访问日志配置

    一.Nginx 访问日志介绍 Nginx 软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由 ngx_http_log_module 模块负责. 二. ...

  5. Nginx访问日志、 Nginx日志切割、静态文件不记录日志和过期时间

    1.Nginx访问日志 配制访问日志:默认定义格式: log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_loc ...

  6. Logstash+ElasticSearch+Kibana处理nginx访问日志(转)

    ELK似乎是当前最为流行的日志收集-存储-分析的全套解决方案. 去年年初, 公司里已经在用, 当时自己还山寨了一个统计系统(postgresql-echarts, 日志无结构化, json形式存储到p ...

  7. Nginx访问日志、日志切割、静态文件不记录日志和过期时间

    6月8日任务 12.10 Nginx访问日志12.11 Nginx日志切割12.12 静态文件不记录日志和过期时间 12.10 Nginx访问日志 除了在主配置文件nginx.conf里定义日志格式外 ...

  8. Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间

    一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format  日至格式 改为davery格式 $remote_addr  客户端IP ...

  9. Nginx访问日志.Nginx日志切割

    11月27日任务 12.10 Nginx访问日志12.11 Nginx日志切割12.12 静态文件不记录日志和过期时间 1.Nginx访问日志 示例一: 日志格式 vim /usr/local/ngi ...

随机推荐

  1. SQL SERVER Study

    1. SQL SERVER Install    可以免费试用天.最新的是2014版本.   2. Attach, Detach 可以添加或去掉已有的数据库文件.     数据库文件的格式是: .md ...

  2. JavaScript进阶 - 第1章 系好安全带,准备启航

    第1章 系好安全带,准备启航 1-1让你认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂 ...

  3. CSS3动画总结学习(一)

    参考文章: CSS3 Transitions, Transforms和Animation使用简介与应用展示 CSS 参考手册 动画的分类 平移动画 transform: 就是变换, 变换, 变换 也就 ...

  4. 《深入理解java虚拟机》笔记(6)内存分配与回收策略

    一.垃圾回收日志说明 [GC[DefNew: 7307K->494K(9216K), 0.0043710 secs] 7307K->6638K(19456K), 0.0044894 sec ...

  5. ruby 数组 Hash相互转换

    由[索引, 值, ...] 型的数组变为哈希表 ary = [1,"a", 2,"b", 3,"c"] p Hash[*ary] # =&g ...

  6. AJPFX辨析Java中堆内存和栈内存的区别

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  7. 根据用户ID生成不重复的最小6位随机邀请码

    网上看到一个例子,借鉴修改一下 实现根据long类型的用户ID生成6位随机邀请码,并且根据邀请码能算出用户ID.代码如下: /** 自定义进制(选择你想要的进制数,不能重复且最好不要0.1这些容易混淆 ...

  8. MySQL memory引擎 table is full 问题处理

    解决mysql的内存表“table is full”错误   101209 13:13:32 [ERROR] /usr/local/mysql/bin/mysqld: The table ‘test_ ...

  9. 判断JS数据类型的几种方法

    原文转自http://www.cnblogs.com/onepixel/p/5126046.html! 说到数据类型,我们先说一下JavaScript 中常见的几种数据类型: 基本类型:string, ...

  10. UVALive 5031 Graph and Queries (Treap)

    删除边的操作不容易实现,那么就先离线然后逆序来做. 逆序就变成了合并,用并存集判断连通,用Treap树来维护一个连通分量里的名次. Treap = Tree + Heap.用一个随机的优先级来平衡搜索 ...