apache日志轮询和分割设置

2016年5月16日

默认Apache日志默认不分割的,对于网站管理员来讲,很多人都会遇到网站的日志文件填满了,而手动删除又很麻烦,所以有聪明的程序员为我们想到了日志轮询的程序。

1、Apache日志

Apache的日志能够详细记录网站的每一个请求,供管理员参考,特别是在网站出现问题的时候,Apache日志文件能提供很多有用的信息,通过分析日志文件,找出网站问题所在。

Apache默认的日志格式可能并不能满足每一个人,有时候我们需要定制Apache日志的格式和内容,比如增加我们感兴趣的内容,删掉我们不感兴趣的内容,或者是改变日志文件记录的格式等等。

在Apache的httpd.conf文件中,通过LogFormat和CustomLog指令可以实现自定义日志文件格式和内容的目的。

LogFormat和CustomLog的格式化参数是一个字符串,这个字符串会在每次请求发生的时候,被记录到日志文件中去。它可以包含被原样写入日志的文本字符串以及控制字符如:" "、"
", 其他的特殊字符均可通过反斜杠转义。

请求本身的情况将通过在格式字符串中放置各种"%"转义的方式来记录。

下面列出了Apache日志格式字符串的含义:

  1. %%     百分号(Apache2.0.44或更高的版本)
  2. %a     远端IP地址
  3. %A     本机IP地址
  4. %B     除HTTP头以外传送的字节数
  5. %b     以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-‘而不是0。
  6. %{Foobar}C     在请求中传送给服务端的cookieFoobar的内容。
  7. %D     服务器处理本请求所用时间,以微为单位。
  8. %{FOOBAR}e     环境变量FOOBAR的值
  9. %f     文件名
  10. %h     远端主机
  11. %H     请求使用的协议
  12. %{Foobar}i     发送到服务器的请求头Foobar:的内容。
  13. %l     远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
  14. %m     请求的方法
  15. %{Foobar}n     来自另一个模块的注解Foobar的内容。
  16. %{Foobar}o     应答头Foobar:的内容。
  17. %p     服务器服务于该请求的标准端口。
  18. %P     为本请求提供服务的子进程的PID。
  19. %{format}P     服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)
  20. %q     查询字符串(若存在则由一个"?"引导,否则返回空串)
  21. %r     请求的第一行
  22. %s     状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。
  23. %t     时间,用普通日志时间格式(标准英语格式)
  24. %{format}t     时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)
  25. %T     处理完请求所花时间,以秒为单位。
  26. %u     远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
  27. %U     请求的URL路径,不包含查询字符串。
  28. %v     对该请求提供服务的标准ServerName。
  29. %V     根据UseCanonicalName指令设定的服务器名称。
  30. %X     请求完成时的连接状态:
  31. X=     连接在应答完成前中断。
  32. +=     应答传送完后继续保持连接。
  33. -=     应答传送完后关闭连接。
  34. (在1.3以后的版本中,这个指令是%c,但这样就和过去的SSL语法:%{var}c冲突了)
  35. %I     接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
  36. %O     发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。

一些常见的格式串:

通用日志格式(CLF)

  1. %h %l %u %t "%r" %>s %b"

Referer日志格式

  1. "%{Referer}i -> %U"

Agent(Browser)日志格式

  1. "%{User-agent}i"

带虚拟主机的通用日志格式

  1. "%v %h %l %u %t "%r" %>s %b"

NCSA扩展/组合日志格式

  1. "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i""

示例:

  1. LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" common

上例中用" "包含的参数都可以在上面找到对应的说明,common,其实是这种格式的一种标识符,当你套用这种格式记录日志的时候,就可以直接使用 标识符了,例如:

  1. CustomLog logs/access_log common

就会在logs下面产生一个以common为格式记录的日志文件access_log。

2、cronolog分割日志

cronolog是一个简单的过滤程序,它从标准输入
设备读入日志记录,并把这些记录写入到输出文件集,输出文件的名字由一个文件名模板和当前的日期时间组成。cronolog通常与web服务器一起使用,
例如apache,用来安全地对日志文件按日期、月或其它特定的区间进行分割。当然也可以配置来分割其他服务的日志,如nginx,lighttpd。

(1)安装cronolog

  1. #wget http://cronolog.org/download/cronolog-1.6.2.tar.gz #tar -xzvf cronolog-1.6.2.tar.gz
  2. #cd cronolog-1.6.2
  3. #./configure --prefix=/usr/local/cronolog
  4. #make
  5. #make install

或者采用 yum / rpm 安装

  1. CentOS 5  64bit
  2. rpm  -ivh http://mirrors.sohu.com/fedora-epel/5/x86_64/cronolog-1.6.2-5.el5.x86_64.rpm
  3. CentOS 5 32 bit
  4. rpm  -ivh http://mirrors.sohu.com/fedora-epel/5/i386/cronolog-1.6.2-5.el5.i386.rpm
  5. CentOS 6  64bit
  6. rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/cronolog-1.6.2-10.el6.x86_64.rpm
  7. CentOS 6 32 bit
  8. rpm -ivh http://mirrors.sohu.com/fedora-epel/6/i386/cronolog-1.6.2-10.el6.i686.rpm

(2)cronolog的用法和格式

语法:/path/to/cronolog [OPTIONS] logfile-spec

其中:

OPTIONS:cronolog的选项,可通过下面示例中的-h 或 –help选项查看

logfile-spec: 是描述输出的日志文件名的模板,每一个无前导%的字符都是文件名的组成部分,%后面跟一个字符为日期和时间格式串,将被下表列出的它们代表的实际字串所替换。
特殊格式串:

  1. %%               %字符
  2. %n                新行
  3. %t                 tab字符

时间格式串:

  1. %H               24小时制小时(00..23)
  2. %I                12小时制小时(01..12)
  3. %p               本地AM/PM指示符
  4. %M             分钟(00..59)
  5. %S               秒(00..61)
  6. %X              本地时间(e.g.: "15:12:47″)
  7. %Z              时区 (e.g. GMT),如果不能检测出时区,值为空

日期格式串:

  1. %a             本地简短星期名(e.g.: Sun..Sat)
  2. %A            本地完整星期名(e.g.: Sunday .. Saturday)
  3. %b            本地简短月名(e.g.: Jan .. Dec)
  4. %B            本地完整月名(e.g.: January .. December)
  5. %c             本地日期与时间(e.g.: "Sun Dec 15 14:12:47 GMT 1996″)
  6. %d            一月中的第几日(01 .. 31)
  7. %j             一年中的第几天 (001 .. 366)
  8. %m           月名的数字表示 (01 .. 12)
  9. %U            一年中以星期日为每周第一天计算的星期数(00..53, 第一周包括新年的第一个星期日)
  10. %W           一年中以星期一为每周第一天计算的星期数(00..53, 第一周包括新年的第一个星期一)
  11. %w            星期名的数字表示 (0 .. 6, 0为星期日)
  12. %x             本地日期 (e.g. 今天在北京是: "15/12/96″)
  13. %y             不带世纪的年(00 .. 99)
  14. %Y             带世纪的年(1970 .. 2038)

 

(3)配置apache使用cronolog分割日志

使用cronolog分割日志的配置中,日志文件名必须以绝对路径(全路径)呈现

下面给出一些示例:

1)对于apache服务日志

#vim httpd.conf
  1. CustomLog logs/access_log combined  //默认

更改为:

  1. CustomLog "|/usr/local/sbin/cronolog  /usr/local/apache2/logs/access_%Y%m%d.log" combined

2)虚拟主机,在VirtualHost内添加

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/access_host_name%Y%m%d.log" combined
  2. ErrorLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/error_host_name%Y%m%d.log"

以上日志格式可根据您的实际情况命名。

配置完成后需要重启apache服务。

(3)查看进程

使用ps -ef查看cronolog进程是否正常运行

[root@Linux ~]# ps -ef | grep cronolog

3 常见的cronolog配置

这里仅以访问日志为例,错误日志类同。

按天分割记录日志,大多数网站的常见配置

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/access_host_name%Y%m%d.log" combined

按小时分割记录日志

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/access_host_name%Y%m%d%H.log" combined

按周轮询覆盖

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/access_host_name_%w.log" combined

按月轮询 ,不常用

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/access_host_name%Y%m.log" combined

按周建立目录,按小时轮询

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/%w/access_host_name%Y%m%d%H.log" combined

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/%w/access_host_name%H.log" combined

按年月生成目录,按天记录日志,不覆盖

  1. CustomLog "|/usr/local/sbin/cronolog   /usr/local/apache2 /logs/%Y/%m/access_host_name%Y%m%d.log" combined

4 cronolog的高级配置

(1)自定义日志格式不记录图片等指定文件类型的访问

  1. <filesmatch?".(ico|gif|jpg|tiff|swf|png|bmp)">
  2. SetEnv IMAGE 1
  3. CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/access_%Y%m%d.log"
  4. combined env=!IMAGE

说明:按天记录日志,并且不记录匹配IMAGE环境中说明的文件格式,这里指不记录对图片的访问。

还可以这样配置

  1. SetEnvIf  Request_URI (gif|png|jpeg|tiff|swf)$ IMAGE=1
  2. CustomLog "|/usr/local/sbin/cronolog /web/logs/access_log-%Y-%m.log" combined env=!IMAGE

  1. LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

添加:

  1. SetEnvIf Remote_Addr "127.0.0.1" dontlog
  2. SetEnvIf Request_URI "^ZendPlatform.*$" dontlog
  3. SetEnvIf Request_URI .healthcheck.html$ dontlog
  4. SetEnvIf Remote_Addr "::1" dontlog
  5. SetEnvIf Request_URI ".getPing.php$" dontlog
  6. SetEnvIf Request_URI "^/error.html$" dontlog
  7. SetEnvIf Request_URI ".gif$" dontlog
  8. SetEnvIf Request_URI ".jpg$" dontlog
  9. SetEnvIf Request_URI ".css$" dontlog
  10. SetEnvIf Request_URI ".swf$" dontlog

5、配置crontab定期清理日志文件

对于不覆盖的日志配置方法,我们可以配置crontab来定期清理日志

#crontab -e

加入以下内容

  1. 10 2 * * * /bin/gzip -f /usr/local/logs/lamp/access_hostname_`date -d yesterday +%Y%m%d`.log
  2. 20 2 * * * /bin/gzip -f /usr/local/logs/lamp/error_hostname_`date -d yesterday +%Y%m%d`.log
  3. 0 3 * * * /usr/bin/find /usr/local/logs/ -name access_*.gz -mtime +7 -exec rm -rf {} ;
  4. 10 3 * * * /usr/bin/find /usr/local/logs/ -name error_*.gz -mtime +7 -exec rm -rf {} ;

说明:

第1、2行将日志文件使用gzip压缩并覆盖源文件;第4、5行find命令找到logs目录下的日志并使用 rm 命令删除7天前修改过的日志。

 

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注