Apache按天截断日志工具,无法生成访问日志

来源:互联网 发布:ai mac版 编辑:程序博客网 时间:2024/05/01 02:23

实践:

CustomLog "|/usr/local/apache2/bin/rotatelogs logs/access_%Y%m%d_%H%M_%S 300" common 
    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    #CustomLog "logs/access_log" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs logs/%Y%m%d_error.log 5M"

注意:如果日志文件没有生成,需要检查是不是路径有问题,可以把日志文件的相对路径改为绝对路径

上述实践在本人机器上可以,然而在另一台linux下就不行了,比较奇怪,我的配置如下:

ErrorLog "|/data02/apache/bin/rotatelogs logs/error_%Y%m%d.log 86400" 可以生成

 CustomLog "|/data02/apache/bin/rotatelogs logs/access_%Y%m%d.log 86400" common 无法生成

而把第二行改为绝对路径就可以了,另外access_logs是自己新添的,不会自动生成,如果该目录不存在,也无法生成

 CustomLog "|/data02/apache/bin/rotatelogs /data02/apache/access_logs/access_%Y%m%d.log 86400" common

 

第二种错误情况:无法生成日志

分析:查看/data01/apache2logs/error.log,有如下内容

Could not open log file '/data01/apache2/access_logs/access_20141205.log' (No such file or directory)
piped log program '/data01/apache2/bin/rotatelogs /data01/apache2/access_logs/access_%Y%m%d.log 86400' failed unexpectedly

解决办法:这个原因是access_logs不能自创建,需要手动建这个目录,创建完后不需要重启就可以看到访问日志了。


关于apache日志的详细信息参考手册:http://man.chinaunix.net/newsoft/ApacheManual/logs.html

附另外的转载文章如下:

用apache系统自带的rotatelogs对日志进行截断处理

  一,修改文件httpd.conf   (bin/rotatelogs)使用绝对路径修改,不要使用相对路径,跑不起来的啦。

      CustomLog "logs/access.log" common  原来的样子

      ErrorLog "logs/error.log"            原来的样子

      CustomLog "|/usr/local/apache2/bin/rotatelogs /var/logs/logfile 86400" common   修改后的样子

      CustomLog "|/usr/local/apache2/bin/rotatelogs /var/logs/logfile 5M" common   修改后的样子

      ErrorLog "|/usr/local/apache2/bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"

  二,重启apache服务,在指定的日志目录中验证。

  三:语法分析

     rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

      可以看到,该命令其实只有两种选项用以对日志文件logfile进行操作。且必须选择其中一种方式。

      第一种,rotationtime   日志文件以秒为单位滚动

      第二种, filesizeM   指定以filesizeM文件大小滚动,而不是按照时间或时差滚动

      举例:ErrorLog "|/usr/local/apache2/bin/rotatelogs/var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"

      此配置会在错误日志大小增长到5兆字节时滚动该日志,

      日志文件名后缀会按照如下格式创建:errorlog.YYYY-mm-dd-HH_MM_SS 。

      至于其他选项, -l  和offset都是和时区相关的,不理他。

   四:文件名称格式(下图是从官网拷贝的)

      errorlog.%Y-%m-%d-%H_%M_%S-------------------errorlog.YYYY-mm-dd-HH_MM_SS 对照研究吧。

%A星期名全称(本地的)%a3个字符的星期名(本地的)%B月份名的全称(本地的)%b3个字符的月份名(本地的)%c日期和时间(本地的)%d2位数的一个月中的日期数%H2位数的小时数(24小时制)%I2位数的小时数(12小时制)%j3位数的一年中的日期数%M2位数的分钟数%m2位数的月份数%pam/pm12小时制的上下午(本地的)%S2位数的秒数%U2位数的一年中的星期数(星期天为一周的第一天)%W2位数的一年中的星期数(星期一为一周的第一天)%w1位数的星期几(星期天为一周的第一天)%X时间(本地的)%x日期(本地的)%Y4位数的年份%y2位数的年份%Z时区名%%符号"%"本身

如何按日期生成apache日志文件及限制apache日志文件大小


用到apache自带的rotatelogs小工具

语法如下:
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

参数解释:
-l :使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。
logfile:它加上基准名就是日志文件名。如果logfile中包含"%",则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单

位的".nnnnnnnnnn"后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime :日志文件滚动的以秒为单位的间隔时间。
offset :相对于UTC的时差的分钟数。如果省略,则假定为"0"并使用UTC时间。比如,要指定UTC时差为"-5小时"的地区的当地时间,则此参数

应为"-300"。
filesizeM :指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

例子:
1、按时间滚动日志文件:
错误日志:ErrorLog "|/data/apache/bin/rotatelogs 日志存放目录/%Y%m%d_error.log 86400 480"
访问日志:CustomLog "|/data/apache/bin/rotatelogs 日志存放目录/%Y%m%d_access.log 86400 480" common

其中:
      /data/apache:为apache的安装目录,根据自己实际情况确定;
      86400:秒,24小时,表示生成的日志文件按天滚动,也就是每天生成一个日志文件;
      480:分,时间偏移。
同理可以按小时滚动日志文件,每隔一个小时,几个小时。。。生成一个日志文件。

扩展:可以写个脚本定时删除日志文件,只保留几天的日志,如果网站访问量比较大,一天会生成几十上百M甚至更大的日志文件,既占硬盘又影响服务器性能。

2、按大小滚动日志文件:
错误日志:ErrorLog "|/data/apache/bin/rotatelogs -l 日志存放目录/%Y%m%d_error.log 5M"
访问日志:CustomLog "|/data/apache/bin/rotatelogs -l 日志存放目录/%Y%m%d_access.log 5M" common

当日志文件达到5M时,滚动该日志文件。

 

apache日志管理

web服务器日志轮循比较好的方式有三种:
第一种方法是利用Linux系统自身的日志文件轮循机制:logrotate;
第二种方法是利用apache自带的日志轮循程序rotatelogs;
第三种是使用在apache的FAQ中推荐发展已经比较成熟的一个日志轮循工具cronolog。

这里我给大家带来的是用apache自带的日志轮循程序rotatelogs,并用shell脚本定期删除日志文件,只保留近3天的文件,以免日志文件占满
磁盘空间。
修改主配置文件httpd.conf
找到以下内容,并修改成:
ErrorLog /var/log/httpd/error_log
CustomLog "|/usr/local/apache2/bin/rotatelogs  /var/log/httpd/access_log 86400 400M" combined
86400    ---日志滚动的时间是一天
400      ---日志文件最大400M就滚动
combined ---采用复合格式

然后建立清除日志文件的shell脚本,文件名为clean_log
#! /bin/bash
logdir=/var/log/httpd
cd ${logdir}
declare -i filesum=`ls access_log.* | wc -l`
declare -i delnum=$filesum-3
if [ "${delnum}" -ge 1 ];then
rm -rf `ls -tr access_log.* | head -${delnum}`
fi

chmod 755 clean_log
这样就保留了最近3天的日志文件。

建立自动化任务
01 04 * * * /usr/local/crontab/clean_log
ok,搞定,就这么简单。这样你就不用不必为日见增大的日志文件烦恼了!


rotatelogs - rotate Apache logs without having to kill the server

描述:
rotatelogs  是一個小程式用來與Apache's 導向(pined)的log相結合,
可以讓您的log依照您的需求而產生 .


語法:
      rotatelogs logfile rotationtime [offset]

參數:
      logfile  基本的logfile名稱,可以加上 strftime(3) 所支援的%字元參數,
                常用的參數為: 
                %Y 表示年份,以今年來說就是 2008
                %m 表示月份,以本月來說就是 04
                %d 表示天數,以今天來說就是 18
                
                若沒有加上,則會附加 .nnnn 為檔案名稱, 其中 nnnn 為log 產生的時間.

      rotationtime  輪迴的時間, 單位: 秒

      offset  與UTC時間的差異,單位為分鐘,若相差5小時,則可使用 -300 這個參數

範例:  (以 accesslog為例 ,修改 httpd.conf 檔案)
將 httpd-access.og  由rotalogs 每間隔86400秒 , 產生 /var/log/httpd-access_log-月份-日期 檔案.

原有內容:
CustomLog /var/log/httpd-access.log combined

改為:
CustomLog "| /usr/local/apach2/bin/rotatelogs /var/log/httpd-access.log-%m-%d 86400" combined




cronolog 割断分析apache日志配置笔记

环境:centos 5.1 + Apache/2.0.61+cronolog(1.6.2)

使用cronolog可以格式化日志文件的格式,比如按时间分割,易于管理和分析。
cronolog的安装配置非常简单,简要说明如下:
1.下载软件
http://cronolog.org/download/index.html
使用wget下载:http://cronolog.org/download/cronolog-1.6.2.tar.gz
2.解压缩
tar -zxvf cronolog-1.6.2.tar.gz

3.进入相应的目录,编译,安装
[root@localhost ~]#./configure
[root@localhost ~]#make
[root@localhost ~]#make install
4.测试cronolog是否安装成功
[root@localhost apache2]# which cronolog
/usr/local/sbin/cronolog
[root@localhost apache2]# cronolog -V
cronolog version 1.6.2
注:如果上述cronolog没有正确安装的话,下面修改httpd.conf 将不能正常启动
4.修改apache配置文件/usr/local/apache2/conf/httpd.conf
#CustomLog logs/access_log common 注销掉原有的日志格式,改为一下
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y%m%d" combined

如果有虚拟主机的话,还要在虚拟主机的VirtualHost中设置:(本文的访问日志都放在access_log中)
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y%m%d" combined

本文配置文件如下:
<VirtualHost *:443>
    DocumentRoot /usr/local/smp/
    ServerName 218.61.31.211
    AddHandler cgi-script .cgi
<Directory "/usr/local/smp/htdocs">
        AllowOverride None
        Options ExecCGI Indexes
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog logs/error_log
    CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y%m%d" combined
</VirtualHost>

5. 杀掉httpd进程 ,重新启动apache
[root@localhost cronolog-1.6.2]# cd /usr/local/apache2/logs/
[root@localhost logs]# killall httpd
[root@localhost logs]# rm access_log   
[root@localhost logs]# /usr/local/apache2/bin/apachectl start 
注意确保apache正常启动
[root@localhost logs]# ps -fe
root     16750     1 0 14:56 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
root     16751 16750 0 14:56 ?        00:00:00 /usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y%m%d
nobody   16774 16750 0 14:56 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16776 16750 0 14:56 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16777 16750 0 14:56 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16800 16750 0 15:06 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16818 16750 0 15:11 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16832 16750 0 15:17 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
nobody   16843 16750 0 15:22 ?        00:00:00 /usr/local/apache2/bin/httpd -k start
6.检查cronolog是否正常割接
从ie访问该机器,在web上多刷新几次.刚开始在/usr/local/apache2/logs/可能没有生成,但经过你多刷新几次,就会出现要的效果,是以天来分割:
access_log.20081103

[root@localhost logs]# ls
access_log.20081103 error_log

强调:/usr/local/apache2/logs/access_log 的原文件没有删除的话,有可能不会出现access_log.20081103。 apache在启动的时候,默认访问日志都会
写入/usr/local/apache2/logs/access_log中,即使此时你进行access_log改名为access_log.bak, 日志就会写入access_log.bak,对于运行apache来说access_log

改名了,但是其inode节点号没变.只有在重启apache的时候 ,apache发现/usr/local/apache2/logs/ 没有access_log文件,此时会自动创建.

7.周期计划删除分割的日志 (每天打包前一天的日志,每天删除半月前的打包日志
[root@ceshiji conf]# crontab -e

0 1 * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
0 3 * * * /bin/gzip -f /usr/local/apache2/logs/access_log.`date -d yesterday +%Y%m%d`
0 4 * * * /usr/bin/find /usr/local/apache2/logs/ -name access_*.gz -mtime +15 -exec rm -rf {} \;

参考来源:http://bbs.linuxtone.org/thread-93-1-1.html

为什么要分割日志
随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、历史安全监察、历史运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
本文将总结一些实用的日志分割方法,希望能够方便 Linux/Unix管理员对日志文件进行有效的管理,如果文件过多过大,可以删除一些历史的文件。
 
几种日志分割方法
2.1.1. 用第三方程序cronolog进行日志分割
2.1.2. 用自写的脚本进行日志分割
2.1.3. 用第三方程序newsyslog进行日志分割
2.1.1. 用第三方程序cronolog进行日志分割
这种方法最便捷快速,缺点是只支持Apache。

例 2.1. 用cronolog分割日志
1. 下载cronolog 
官方历史地址: http://cronolog.org/download/cronolog-1.6.2.tar.gz

tar xzvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
2. 编译 

./configure
make
make install
3. 修改Apache的配置文件httpd.conf,加入以下代码 

CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/www/access%Y%m%d.log" combined

 注意 
如果Apache中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件名改成不同的名字
 

 提示 
/var/log/httpd/www/ 可以更改为任何日志输出路径 

4. 保存配置后重新启动Apache服务 

/etc/rc.d/init.d/httpd stop
/etc/rc.d/init.d/httpd start
最后生成的文件名如以下格式: 
/var/log/httpd/www/access20050918.log

2.1.2. 用自写的脚本进行日志分割
如果因为条件不允许,不能使用cronolog分割,这里提供一种更加简洁的方法,可适合以下系统 
Linux 
Unix
*BSD
例 2.2. 计划任务的方式每天生成一个文件并压缩存放
 注意 
假设:/var/log /httpd/ 为日志存放的路径,access_log 为以前的日志文件名 
1. 创建新文件: /var/log/httpd/log-task.cron 
文件内容如下
 
#!/bin/bash
YESTERDAY=`date -d yesterday +%Y%m%d`
/usr/bin/gzip -c /var/log/httpd/access_log>/var/log/httpd/access${YESTERDAY}.log.gz
>/var/log/httpd/access_log
 
保存退出

2. 修改文件的执行权限并测试脚本 

chmod u+x /var/log/httpd/log-task.cron

立即执行一次,测试脚本是否正常工作

 注意 
测试之前建议先备份一下日志文件(/var/log/httpd/access_log) 

测试:
/var/log/httpd/log-task.cron
检查/var/log/httpd 目录下是否已经生成了日期命名的文件。
3. 将该脚本加入到自动运行任务中 
crontab -e
然后将以下的的代码拷贝加入到cron的启动脚本末尾:
 
1      0      *       *       *       /var/log/httpd/log-task.cron

保存退出。
 提示 
(每天凌晨0点1分系统将自动进行日志回滚任务,最终会在/var/log/httpd目录下每天生成一个压缩的日志文件,文件名如 access20051216.log.gz) 
 
2.1.3. 用第三方程序newsyslog进行日志分割
这种方法适用于SQUID等无法使用cronolog的WebServer,缺点是安装比较复杂。
例 2.3. 用newsyslog分割日志
 注意 
假设:/usr/local /squid/var/logs/ 为日志存放的路径,access.log 为以前的日志文件名 
1. 下载newsyslog 
官方历史地址: http://archives.eyrie.org/software/system/newsyslog-1.8.tar.gz

tar xzvf newsyslog-1.8.tar.gz
cd newsyslog-1.8
2. 编译 

./configure
make
make install
3. 创建一个新的文件 /usr/local/etc/newsyslog.conf 

set squid_logpath = /usr/local/squid/var/logs
set squid_log = /usr/local/squid/var/logs/access.log
set date_squid_log = /usr/local/squid/var/logs/access%Y%M%D.log
SQUID{
        restart: run /usr/local/squid/sbin/squid -k rotate
        log:  SQUID squid_log squid squid 644
        archive: SQUID date_squid_log 0
}
 
保存退出

 提示 
/usr/local/squid/var/logs 可以更改为任何日志输出路径 

4. 将该脚本加入到自动运行任务中 
crontab -e
然后将以下的的代码拷贝加入到cron的启动脚本末尾:
 
58      23      *       *       *       /usr/local/sbin/newsyslog

最后生成的文件名如以下格式: 
/usr/local/squid/var/logs/access20050918.log

参考http://blog.chinaunix.net/uid-17085332-id-2832132.html

原创粉丝点击