默认Apache日志默认不分割的,对于网站管理员来讲,很多人都会遇到网站的日志文件填满了,而手动删除又很麻烦,所以有聪明的程序员为我们想到了日志轮询的程序。
1、Apache日志
Apache的日志能够详细记录网站的每一个请求,供管理员参考,特别是在网站出现问题的时候,Apache日志文件能提供很多有用的信息,通过分析日志文件,找出网站问题所在。
Apache默认的日志格式可能并不能满足每一个人,有时候我们需要定制Apache日志的格式和内容,比如增加我们感兴趣的内容,删掉我们不感兴趣的内容,或者是改变日志文件记录的格式等等。
在Apache的httpd.conf文件中,通过LogFormat和CustomLog指令可以实现自定义日志文件格式和内容的目的。
LogFormat和CustomLog的格式化参数是一个字符串,这个字符串会在每次请求发生的时候,被记录到日志文件中去。它可以包含被原样写入日志的文本字符串以及控制字符如:" "、"
", 其他的特殊字符均可通过反斜杠转义。
请求本身的情况将通过在格式字符串中放置各种"%"转义的方式来记录。
下面列出了Apache日志格式字符串的含义:
- %% 百分号(Apache2.0.44或更高的版本)
- %a 远端IP地址
- %A 本机IP地址
- %B 除HTTP头以外传送的字节数
- %b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-‘而不是0。
- %{Foobar}C 在请求中传送给服务端的cookieFoobar的内容。
- %D 服务器处理本请求所用时间,以微为单位。
- %{FOOBAR}e 环境变量FOOBAR的值
- %f 文件名
- %h 远端主机
- %H 请求使用的协议
- %{Foobar}i 发送到服务器的请求头Foobar:的内容。
- %l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
- %m 请求的方法
- %{Foobar}n 来自另一个模块的注解Foobar的内容。
- %{Foobar}o 应答头Foobar:的内容。
- %p 服务器服务于该请求的标准端口。
- %P 为本请求提供服务的子进程的PID。
- %{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)
- %q 查询字符串(若存在则由一个"?"引导,否则返回空串)
- %r 请求的第一行
- %s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。
- %t 时间,用普通日志时间格式(标准英语格式)
- %{format}t 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)
- %T 处理完请求所花时间,以秒为单位。
- %u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
- %U 请求的URL路径,不包含查询字符串。
- %v 对该请求提供服务的标准ServerName。
- %V 根据UseCanonicalName指令设定的服务器名称。
- %X 请求完成时的连接状态:
- X= 连接在应答完成前中断。
- += 应答传送完后继续保持连接。
- -= 应答传送完后关闭连接。
- (在1.3以后的版本中,这个指令是%c,但这样就和过去的SSL语法:%{var}c冲突了)
- %I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
- %O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
一些常见的格式串:
通用日志格式(CLF)
- %h %l %u %t "%r" %>s %b"
Referer日志格式
- "%{Referer}i -> %U"
Agent(Browser)日志格式
- "%{User-agent}i"
带虚拟主机的通用日志格式
- "%v %h %l %u %t "%r" %>s %b"
NCSA扩展/组合日志格式
- "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i""
示例:
- LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" common
上例中用" "包含的参数都可以在上面找到对应的说明,common,其实是这种格式的一种标识符,当你套用这种格式记录日志的时候,就可以直接使用 标识符了,例如:
- CustomLog logs/access_log common
就会在logs下面产生一个以common为格式记录的日志文件access_log。
2、cronolog分割日志
cronolog是一个简单的过滤程序,它从标准输入
设备读入日志记录,并把这些记录写入到输出文件集,输出文件的名字由一个文件名模板和当前的日期时间组成。cronolog通常与web服务器一起使用,
例如apache,用来安全地对日志文件按日期、月或其它特定的区间进行分割。当然也可以配置来分割其他服务的日志,如nginx,lighttpd。
(1)安装cronolog
- #wget http://cronolog.org/download/cronolog-1.6.2.tar.gz #tar -xzvf cronolog-1.6.2.tar.gz
- #cd cronolog-1.6.2
- #./configure --prefix=/usr/local/cronolog
- #make
- #make install
或者采用 yum / rpm 安装
- CentOS 5 64bit
- rpm -ivh http://mirrors.sohu.com/fedora-epel/5/x86_64/cronolog-1.6.2-5.el5.x86_64.rpm
- CentOS 5 32 bit
- rpm -ivh http://mirrors.sohu.com/fedora-epel/5/i386/cronolog-1.6.2-5.el5.i386.rpm
- CentOS 6 64bit
- rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/cronolog-1.6.2-10.el6.x86_64.rpm
- CentOS 6 32 bit
- 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: 是描述输出的日志文件名的模板,每一个无前导%的字符都是文件名的组成部分,%后面跟一个字符为日期和时间格式串,将被下表列出的它们代表的实际字串所替换。
特殊格式串:
- %% %字符
- %n 新行
- %t tab字符
时间格式串:
- %H 24小时制小时(00..23)
- %I 12小时制小时(01..12)
- %p 本地AM/PM指示符
- %M 分钟(00..59)
- %S 秒(00..61)
- %X 本地时间(e.g.: "15:12:47″)
- %Z 时区 (e.g. GMT),如果不能检测出时区,值为空
日期格式串:
- %a 本地简短星期名(e.g.: Sun..Sat)
- %A 本地完整星期名(e.g.: Sunday .. Saturday)
- %b 本地简短月名(e.g.: Jan .. Dec)
- %B 本地完整月名(e.g.: January .. December)
- %c 本地日期与时间(e.g.: "Sun Dec 15 14:12:47 GMT 1996″)
- %d 一月中的第几日(01 .. 31)
- %j 一年中的第几天 (001 .. 366)
- %m 月名的数字表示 (01 .. 12)
- %U 一年中以星期日为每周第一天计算的星期数(00..53, 第一周包括新年的第一个星期日)
- %W 一年中以星期一为每周第一天计算的星期数(00..53, 第一周包括新年的第一个星期一)
- %w 星期名的数字表示 (0 .. 6, 0为星期日)
- %x 本地日期 (e.g. 今天在北京是: "15/12/96″)
- %y 不带世纪的年(00 .. 99)
- %Y 带世纪的年(1970 .. 2038)
(3)配置apache使用cronolog分割日志
使用cronolog分割日志的配置中,日志文件名必须以绝对路径(全路径)呈现
下面给出一些示例:
1)对于apache服务日志
#vim httpd.conf
- CustomLog logs/access_log combined //默认
更改为:
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_%Y%m%d.log" combined
2)虚拟主机,在VirtualHost内添加
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/access_host_name%Y%m%d.log" combined
- 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配置
这里仅以访问日志为例,错误日志类同。
按天分割记录日志,大多数网站的常见配置
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/access_host_name%Y%m%d.log" combined
按小时分割记录日志
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/access_host_name%Y%m%d%H.log" combined
按周轮询覆盖
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/access_host_name_%w.log" combined
按月轮询 ,不常用
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/access_host_name%Y%m.log" combined
按周建立目录,按小时轮询
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/%w/access_host_name%Y%m%d%H.log" combined
或
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/%w/access_host_name%H.log" combined
按年月生成目录,按天记录日志,不覆盖
- CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2 /logs/%Y/%m/access_host_name%Y%m%d.log" combined
4 cronolog的高级配置
(1)自定义日志格式不记录图片等指定文件类型的访问
- <filesmatch?".(ico|gif|jpg|tiff|swf|png|bmp)">
- SetEnv IMAGE 1
- CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/access_%Y%m%d.log"
- combined env=!IMAGE
说明:按天记录日志,并且不记录匹配IMAGE环境中说明的文件格式,这里指不记录对图片的访问。
还可以这样配置
- SetEnvIf Request_URI (gif|png|jpeg|tiff|swf)$ IMAGE=1
- CustomLog "|/usr/local/sbin/cronolog /web/logs/access_log-%Y-%m.log" combined env=!IMAGE
或
- LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
添加:
- SetEnvIf Remote_Addr "127.0.0.1" dontlog
- SetEnvIf Request_URI "^ZendPlatform.*$" dontlog
- SetEnvIf Request_URI .healthcheck.html$ dontlog
- SetEnvIf Remote_Addr "::1" dontlog
- SetEnvIf Request_URI ".getPing.php$" dontlog
- SetEnvIf Request_URI "^/error.html$" dontlog
- SetEnvIf Request_URI ".gif$" dontlog
- SetEnvIf Request_URI ".jpg$" dontlog
- SetEnvIf Request_URI ".css$" dontlog
- SetEnvIf Request_URI ".swf$" dontlog
5、配置crontab定期清理日志文件
对于不覆盖的日志配置方法,我们可以配置crontab来定期清理日志
#crontab -e
加入以下内容
- 10 2 * * * /bin/gzip -f /usr/local/logs/lamp/access_hostname_`date -d yesterday +%Y%m%d`.log
- 20 2 * * * /bin/gzip -f /usr/local/logs/lamp/error_hostname_`date -d yesterday +%Y%m%d`.log
- 0 3 * * * /usr/bin/find /usr/local/logs/ -name access_*.gz -mtime +7 -exec rm -rf {} ;
- 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天前修改过的日志。
没有评论