最熟悉的陌生人 - access log

最熟悉的陌生人 - access log

简介

access log一直是我们服务端运维找问题的好帮手,但是作为一个偏应用层的开发者来说,可能会有着那么一点陌生,例如access log写入日志的时机是什么时候呢?谁能写?怎么配置等等,所以在这篇文章里面,我会试图从官方文档去找到所需要的一切的答案。

什么是access log

顾名思义,access log就是用来记录用户的请求日志。可通过nginx的配置文件来配置他的保存位置和输出的日志格式。

日志告诉了我们什么信息

1
176.51.166.239 - - [28/Jul/2017:15:41:30 +0800] "POST /wp-login.php HTTP/1.1" 200 2644 "http://awesomesevens.com/wp-login.php" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0"

这是一条默认的日志,具体的内容我们参照官网给的默认格式来看:

1
2
3
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent";
  1. 176.51.166.239
    $remote_addr : 客户端(用户)的请求IP

  2. -
    $remote_user : 已经经过Auth Basic Module验证的用户名。”-“就是没有记录到。

  3. [28/Jul/2017:15:41:30 +0800]
    $time_local : 记录的时间

  4. “POST /wp-login.php HTTP/1.1”
    $request : 请求的url,POST 为请求的方法,HTTP/1.1为请求的协议

  5. 200
    $status : 请求的状态,具体的状态代表的意义可以看我的另一篇文章 开发时候常会遇到的状态码

  6. 2644
    $body_bytes_sent : 传送页面的字节数

  7. http://awesomesevens.com/wp-login.php
    $http_referer : 来源页面,即从哪个页面转到本页

  8. Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0
    $http_user_agent : 用户的浏览器信息,终端,版本等

配置

配置也很简单,在nginx config的server配置中加入下面一句

1
access_log  /var/log/nginx/access.log  main;

中间是要放置的log的地址,后面的main对应的是上一节设定的格式。

access太大怎么办

我的建议是如果访问量大得夸张的话,最好把日志一块交给应用层去做,抽出来做一个日志系统,方便后续的分析。
如果访问量还没到夸张的层次的时候,也要考虑日志的占用空间问题。所以对每天的日志进行压缩和转存就很有必要了。网上的有人用的是写shell+crontab来做,但其实linux本来已经提供了一个很好的工具给我们去做这件事情,叫logrotate。
一般logrotate的配置文件会放置在 /etc/logrotate.d 路径下,下面是我的一个logrotate对于nginx日志的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38



/var/log/nginx/*.log {

daily

missingok

rotate 14

compress

delaycompress

notifempty

create 0640 www-data adm

sharedscripts

prerotate

if [ -d /etc/logrotate.d/httpd-prerotate ]; then \

run-parts /etc/logrotate.d/httpd-prerotate; \

fi \

endscript

postrotate

invoke-rc.d nginx rotate >/dev/null 2>&1

endscript

}

参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).