最新总结,超实用 Apache Log 分割 So easy

Apache Log Split-日志分割

​ 由于Apache httpd 服务的日志默认都写入$HTTP_HOME/logs 目录下,由于网站访问量增加会导致apache 的单个日志文件越来越大、在日常查找问题,定位分析问题带来了一定的困扰,以及日志归档。针对以上问题,通过分析和查阅资料进行优化管理。这次利用httpd 服务自带的通过管道将日志信息发送给另一个程序的功能去加强对日志的管理(apache httpd server 不会将日志直接写入文件)。因此我们可以利用这个功能将日志重定向到日志分析工具、日志压缩备份等程序,方法是将配置文件中日志文件部分重定向到program(|program)。

一、日志文件分割工具

1. Apache httpd 自带的日志分割工具(rotatelogs)

1. rotatelogs 工具在$HTTP_HOME/bin 目录下,直接修改httpd.conf
1)需要apache 加载 log_conf_module,如下:
# LoadModule log_config_module modules/mod_log_config.so     #log 配置模块
2. 直接修改配置,将log 重定向到rotatelogs 程序按天分割日志:(示例:每隔30s 分割一次日志)
# ErrorLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /usr/local/httpd-2.2.15/logs/%Y_%m_%d_error_log 30 480"
# CustomLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /usr/local/httpd-2.2.15/logs/%Y_%m_%d_access_log 30 480" combined

##################################   参数解析  #####################################
# .------------------------------------— 管道符
# |     .-----------------------------------rotatelogs 程序路径
# |     |                         .-------- 生成的日志文件  .--------- 间隔多久分割日志    
# |     |                         |                      |  .---------- 时区偏移
# |     |                         |                      |  |      .------ 日志格式     
# |     |                         |                      |  |      |
# | $HTTP/bin/rotatelogs $HTTP/logs/%Y_%m_%d_access.log 30 480" combined
2.1 对其他站点log配置日志分割(多个站点,将以上配置写到各站点的VirtualHost节点中,以便各站点分别记录各站点的日志,如下:)
<VirtualHost *:10060>
    DocumentRoot /www/wwwroot/mywebdir
    ServerName www.Webtest.com
    ServerAlias www.Webtest.com
    <Directory "/www/wwwroot/mywebdir/">
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /www/wwwroot/mywebdir/Webtest_logs/%Y%m%d_Webtest.com_error_log 86400 480"
    CustomLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /www/wwwroot/mywebdir/Webtest_logs/%Y%m%d_Webtest.com_access_log 86400 480" combined
</VirtualHost>
3. 重新启动httpd 服务
# /usr/local/httpd-2.2.15/bin/apachectl -k restart 
4.查看日志是否正常分割:
[root@version logs]# ll
-rw-r--r-- 1 root root    153 Sep 11 15:02 15_02_30_access_log
-rw-r--r-- 1 root root    420 Sep 11 15:03 15_03_00_access_log
-rw-r--r-- 1 root root    980 Sep 11 15:05 15_05_30_access_log
-rw-r--r-- 1 root root     70 Sep 11 15:06 15_06_00_access_log
-rw-r--r-- 1 root root     83 Sep 11 15:08 15_08_30_access_log
-rw-r--r-- 1 root root    384 Sep 11 15:45 15_45_30_access_log
-rw-r--r-- 1 root root   2000 Sep 11 15:48 15_48_30_access_log
-rw-r--r-- 1 root root   1090 Sep 11 15:00 2019_09_11_access_log
-rw-r--r-- 1 root root  41481 Sep  3 12:39 access_log
-rw-r--r-- 1 root root 904431 Sep 11 15:48 error_log
5. rotatelogs 使用帮助
1. 简述:rotatelogs 是 Apache 2.2 中自带的管道日志程序。
2. 基本语法格式
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
3. 选项:
选项(Option)描述
-l:使用本地时间代替GMT时间作为时间基准。
logfile它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime日志文件分割以为单位的间隔时间。
offset相对于UTC的时差的分钟数。如果省略,默认为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。由于北京时间为+8时间,因此,应设置为480,保持日志时间和本地时间一致,如时间同步开启,则可忽略此参数
filesizeM指定以filesizeM文件大小分割,而不是按照时间或时差分割。单位为K,M,G
rotatelogs 常用:
CustomLog "| bin/rotatelogs  logs/%Y_%m_%d.access.log 86400 480" combined  # 按天分割日志 
// 或者
CustomLog "| bin/rotatelogs  logs/%Y_%m_%d.access.log 2M" combined  # 按照文件2M 大小分割

2. Thirty party Tools—— Cronolog 日志分割

1. Cronolog 工具源码安装:
[root@version sbin]# tar -xf cronolog-1.6.2.tar.gz  # 解压源码package
[root@version sbin]# cd cronolog-1.6.2      
[root@version sbin]# ./configure --prefix=/usr/local/cronolog   # 预编译
[root@version sbin]# make && make install     # 编译并安装
[root@version sbin]# cd /usr/local/cronolog/sbin/
[root@version sbin]# ./cronolog -V     # 验证安装   
cronolog version 1.6.2                 # 安装Successful
2. 修改配置文件(示例为了效果,每访问一次,就会生成一个新的日志: # %Y%m%d 按天生成)
# ErrorLog "| /usr/local/cronolog/sbin/cronolog /opt/httpd-2.2.15/logs/%H_%M_%S_error_log"     
#CustomLog "| /usr/local/cronolog/sbin/cronolog /opt/httpd-2.2.15/logs/%H_%M_%S_access_log" combined
3. 重新启动httpd 服务
# /usr/local/httpd-2.2.15/bin/apachectl -k restart 
4. 查看日志是否正常分割:
[root@version logs]# ls -l
-rw-r--r-- 1 root root    192 Sep 11 18:01 18_01_39_access_log
-rw-r--r-- 1 root root    192 Sep 11 18:02 18_02_15_access_log
-rw-r--r-- 1 root root    192 Sep 11 18:02 18_02_27_access_log
drwxr-xr-x 2 root root   4096 Sep 11 17:20 bak
-rw-r--r-- 1 root root 906780 Sep 11 18:02 error_log

附录:

1. 禁用apache 的log,编辑 httpd.conf :
ErrorLog /dev/null  #禁用错误日志
CustomLog /dev/null common  #禁用访问日志
2. 注意:使用 cronolog 工具分割日志时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建。
3. Apache 日志记录格式
  • LogFormat、CustomLog指令,是定制日志文件的格式。

  • LogFormat指令定义格式并为格式指定一个名字,方便可以直接引用这个名字。

  • CustomLog指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。
    例如,在默认的httpd.conf文件中:

    #  .------------------------- LogFormat 指令,定义日志记录格式
    #  |         .---------------- 远程主机地址
    #  |         |  .----------------远程登录的名字
    #  |         |  |   .---------------- 远程用户
    #  |         |  |   |  .---------------输出标准时间格式 
    #  |         |  |   |  |    .------------请求的第一行
    #  |         |  |   |  |    |    .--------后面的请求(status_code)
    #  |         |  |   |  |    |    |   .----------- 发送数据大小
    #  |         |  |   |  |    |    |   |   .-------- 日志格式名称
    # LogFormat "%h %l %u %t \"%r\" %>s %b" common
    

    该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。

    Apache常用格式串的变量及其意义,
    变量描述
    %…a:远程IP地址
    %…A:本地IP地址
    %…B:已发送的字节数,不包含HTTP头
    %…b:CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0。
    %…f:文件名字
    %…h:远程主机地址
    %…H:请求的协议。
    %…l:远程登录名字(来自identd,如提供的话)
    %…m:请求的方法
    %…p:服务器响应请求时使用的端口
    %…P:响应请求的子进程ID。
    %…q:查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)
    %…r:请求的第一行
    %…s:状态。对于进行内部重定向的请求,这是指原来请求的状态。如果用%…>s,则是指后来的请求。
    %…t:以公共日志时间格式表示的时间(或称为标准英文格式)
    %…T:为响应请求而耗费的时间,以秒计
    %…u:远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
    %…U:用户所请求的URL路径
    %…v:响应请求的服务器的ServerName
    %…{format}t:以指定格式format表示的时间

    注:“…”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代

    4. 定制日志记录

    定制日志中记录某些特定的、已定义的信息,这时就要用到“…”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。

1. 记录的是网站的所有无效链接,那么可以使用:
LogFormat %401{Referer}i BrokenLinks
2. 记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:
LogFormat %!200U SomethingWrong
3. 专门记录某个爬虫记录
SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t \”%r\” %>s %b” robot
CustomLog “|$HTTP_HOME/bin/rotatelogs $HTTP_HOME/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot

这样在logs目录下,就会每天产生baidu_年月日.txt的日志了,每条的记录和下面的类似:

 #   61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET /  HTTP/1.1″ 200 8427
4. 排除日志记录图片、js、css、swf文件
<FilesMatch "\.(ico|gif|jpg|png|bmp|swf|css|js)">
  SetEnv IMAG 1
</FilesMatch>
CustomLog "|cronolog logs/access_%Y%m%d.log" combined env=!IMAG

参考:

  1. Apache httpd document
  2. Apache日志配置参数详细说明
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值