访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。

Nginx中访问日志相关指令主要有两条,一条是log_format,用来设置日志的格式,另外一条是access_log,用来指定日志文职的存放路径、格式和缓存大小。两条指令在Nginx配置文件中的位置可以在http之间。

日志配置

log_format

log_format用来设置日志格式,格式如下所示

  1. log_format name(名称) format(格式)

在Nginx中有自己默认的日志格式,如下内容:

  1. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  2. # '$status $body_bytes_sent "$http_referer" '
  3. # '"$http_user_agent" "$http_x_forwarded_for"';

这段内容什么意思呢?我们来理解下。

  • $remote_addr:客户端的ip地址(如果中间有代理服务器那么这里显示的ip就为代理服务器的ip地址)
  • $remote_user:用于记录远程客户端的用户名称(一般为“-”)
  • $time_local:用于记录访问时间和时区
  • $request:用于记录请求的url以及请求方法
  • $status:响应状态码
  • $body_bytes_sent:给客户端发送的文件主体内容大小
  • $http_referer:可以记录用户是从哪个链接访问过来的
  • $http_user_agent:用户所使用的代理(一般为浏览器)
  • $http_x_forwarded_for:可以记录客户端IP,通过代理服务器来记录客户端的ip地址

现在,我们添加一个我们自定义日志信息。例如,如果我们用Nginx作为反向代理服务,就不能获取客户端的真实IP地址IP了,因为经过反向代理后,在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP。

  1. log_format mylog '$remote_addr [$time_local] "$request" $status';

日志格式允许包含的变量注释,如下所示

  1. $remote_addr, $http_x_forwarded_for 记录客户端IP地址
  2. $remote_user 记录客户端用户名称
  3. $request 记录请求的URL和HTTP协议
  4. $status 记录请求状态
  5. $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
  6. $bytes_sent 发送给客户端的总字节数。
  7. $connection 连接的序列号。
  8. $connection_requests 当前通过一个连接获得的请求数量。
  9. $msec 日志写入时间。单位为秒,精度是毫秒。
  10. $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
  11. $http_referer 记录从哪个页面链接访问过来的
  12. $http_user_agent 记录客户端浏览器相关信息
  13. $request_length 请求的长度(包括请求行,请求头和请求正文)。
  14. $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
  15. $time_iso8601 ISO8601标准格式下的本地时间。
  16. $time_local 通用日志格式下的本地时间。

access_log

用log_format指令设置了日志格式之后,需要用access_log指令指定日志文件存放路径。

格式如下所示

  1. access_log path(存放路径) [format(自定义日志格式名称) [buffer=size | off]]

在Nginx中有自己默认的日志路径,如下内容:

  1. #access_log logs/access.log main;

如果想关闭日志,可以如下:

  1. access_log off;

值得注意的是,Nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错。

此外,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off)。

日志切割

当网站访问量大后,日志数据就会很多,如果全部写到一个日志文件中去,文件会变得越来越大。文件大速度就会慢下来,比如一个文件几百兆。写入日志的时候,会影响操作速度。另外,如果我想看看访问日志,一个几百兆的文件,下载下来打开也很慢。

为了方便对日志进行分析计算,需要对日志进行定时切割。定时切割的方式有按照月切割、按天切割,按小时切割等。最常用的是按天切割。

配置shell脚本

  1. #!/bin/bash
  2. # 设置日志文件存放目录
  3. logs_path="/var/logs/nginx/"
  4. # 设置pid文件
  5. pid_path="/usr/local/dev/nginx/nginx.pid"
  6. # 重命名日志文件
  7. mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
  8. # 向nginx主进程发信号重新打开日志
  9. kill -USR1 `cat ${pid_path}`

crontab中设置定时作业

进行编辑

  1. crontab -e

配置内容如下

  1. 0 0 * * * bash /usr/local/dev/nginx/nginx_log.sh

这样在每天的夜晚12点就会自动创建备份文件了。.

Nginx日志配置与切割的更多相关文章

  1. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  2. nginx日志配置

    nginx日志配置 http://www.ttlsa.com/linux/the-nginx-log-configuration/ 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如 ...

  3. Linux下添加shell脚本使得nginx日志每天定时切割压缩

    Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常 ...

  4. (转)nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  5. Nginx https加密以及nginx日志配置与管理

    Nginx https加密以及nginx日志配置与管理 使用Nginx的优点Nginx作为WEB服务器,Nginx处理静态文件.索引文件.自动索引的效率非常高.Nginx作为代理服务器,Nginx可以 ...

  6. nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  7. Nginx日志按天切割基本配置说明

    1.声明日志格式 声明log    log位置                log格式; access_log logs/access.log main; 2.定义日志格式(以下为常用的日志格式 可 ...

  8. Nginx日志配置及日志切割

    日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_s ...

  9. Nginx实战(三) 日志配置与切割

    访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义.通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息. Nginx中访问日志相关指令主要有两条,一条是 ...

随机推荐

  1. Python_Tips[2] -> 函数延后估值及字节码分析

    函数延后估值及字节码分析 在一个循环中定义了函数 f 但是并未对其进行调用,在循环结束后调用,此时i值为3故最终3个函数输出均为9.而非1, 4, 9. 这是由于在定义闭包函数 f 时,传入变量 i, ...

  2. Python的网络编程[0] -> socket[1] -> socket 模块

    socket 1. 常量 / Constants AF_* 和 SOCK_* 分别属于 AddressFamily 和 SocketType 1.1 AF_*类常量 socket.AF_UNIX:  ...

  3. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

  4. hdu6040

    hdu6040 题意 将一个函数运行 n 次,一共得到 n 个值,有 m 次询问,每次询问第 k 小的值. 分析 考察了 \(nth\_element\) 函数的运用.\(nth\_element(a ...

  5. UAF学习之Adobe reader CVE-2013-3346

    学习了UAF,分析了几个漏洞,同时,也熟悉了windbg的用法,收获挺大. 基本的UAF分析流程如下: i:找有漏洞的函数 ii:找到被释放对象的类型,以及被释放对象在内存中的位置 iii:理解对象的 ...

  6. 【BZOJ2276】Temperature

    题面 Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The ...

  7. [BZOJ 3108] 图的逆变换

    Link: BZOJ 3108 传送门 Solution: 样例教你做题系列 观察第三个输出为No的样例,发现只要存在$edge(i,k),edge(j,k)$,那么$i,j$的出边一定要全部相同 于 ...

  8. 2.2多线程(java学习笔记)线程状态及线程操作的相关方法

    一.线程的状态 线程一般具有五种状态,即创建.就绪.运行.阻塞.终止. 它们之间的关系: 二.线程操作相关方法 1.设置和取得线程名称. 如果不设置线程名称,系统会自动分配线程名,一般格式为Threa ...

  9. 八. 输入输出(IO)操作2.面向字符的输入流

    字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...

  10. Visio中如何画面积一样的形状

    如图,刚开始我想着用辅助的那些线(对齐),实现不了,后来想想直接复制就行了...........