您的位置:首页 > 其它

日志切割轮询技术(cronolog and rotatelogs)

2015-09-16 07:41 453 查看

一、安装环境说明

系统环境:操作系统 CentOS 6.5 x86_64

软件版本 cronolog 1.6.2,软件下载地址: http://cronolog.org/download/index.html

二、Cronolog 是什么

大家都知道apache服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计,而且导致单个文件过大的情况。本博文主要讲解Web服务器日志切割工具cronolog,下面我们就来详细的讲解一下 cronolog安装和使用。
Welcome to cronolog.org, the home of the cronolog web log rotation program. cronolog is a simple filter program that reads log file entries from standard input and writes each entry to the output file specified by a filename template and the current date and time. When the expanded filename changes, the current file is closed and a new one opened. cronolog is intended to be used in conjunction with a Web server, such asApache, to split the access log into daily or monthly logs. cronolog 是一款日志轮询(rotation)工具,可以用它来把Apache, Tomcat, Nginx等WEB服务器的输出日志切分按日或者按月保存。cronolog 从标准输入中读取日志内容,然后把他们写到按指定格式命名的日志文件中。当日期改变后, cronolog会把之前的日志文件关闭,再打开一个包含新日期的日志文件。利用cronolog可以完美的解决web服务器日志文件不断增大,且不能在运行时删除的问题。

三、Cronolog 特点

cronolog可以按月、日甚至按小时进行日志轮询,也可以配置每个日志文件的最大值,当文件大小达到这个最大值时,自动记录到下一个日志文件中。 cronolog稳定版本为 1.6.2。但此版本有一个弊端:当日志文件的大小到2G(2150726147字节)时,cronolog进程就变成僵尸进程,即日志无法再写入。 cronolog 1.7 版本解决了这个问题。
需要注意的是,日期改变后,cronolog并不是马上切换日志文件,而是需要有新的日志输出才能触发cronolog切换日志文件。所以如果你想在 2015-06-08 删除 2015-06-07的日志文件,如果从2015-06-08的00:00开始到你执行删除时都没有日志输出,则 2015-08-07的日志文件可能仍然被占用着,导致删除失败。

cronolog主要和Web服务器配置使用,特别是Apache服务器,Apache 默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计。安装cronolog后,可以将日志文件按时间分割,易于管理和分析。下面是与Apache配置的一些指令:
TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
ErrorLog   "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

效果:
/web/logs/2015/12/31/access.log    /web/logs/2015/12/31/errors.log
/web/logs/2015/01/01/access.log    /web/logs/2015/01/01/errors.log


三、Cronolog 安装

1、安装 epel 源(源码编译:可选; yum 安装:必须)
1、安装 epel 源
# wget http://ftp.sjtu.edu.cn/fedora/epel/6/i386/epel-release-6-8.noarch.rpm # rpm -ivh epel-release-6-8.noarch.rpm

2、安装ntpdate
# yum -y install ntpdate

3、时间同步
# ntpdate time.nist.gov

2、安装cronolog
方式一:直接用yum安装
# yum install -y cronolog

#################################

方式二:源码编译安装
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz # tar xf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make && make install

# which cronolog
/usr/local/sbin/cronolog
不知道是否网络原因, 我这边没办法载下来, 可以到下面的地址下载: http://download.chinaunix.net/download.php?id=3457&ResourceID=1851 好了,到这里我们的cronolog就安装完成了,下面我们来说一下cronolog如何使用。

四、Cronolog 使用

(1)、基本使用
# cronolog -h
usage: cronolog [OPTIONS] logfile-spec
-H NAME,   --hardlink=NAME maintain a hard link from NAME to current log
-S NAME,   --symlink=NAME  maintain a symbolic link from NAME to current log
-P NAME,   --prev-symlink=NAME  maintain a symbolic link from NAME to previous log
-l NAME,   --link=NAME     same as -S/--symlink
-h,        --help          print this help, then exit
-p PERIOD, --period=PERIOD set the rotation period explicitly
-d DELAY,  --delay=DELAY   set the rotation period delay
-o,        --once-only     create single output log from template (not rotated)
-x FILE,   --debug=FILE    write debug messages to FILE
( or to standard error if FILE is "-")
-a,        --american         American date formats
-e,        --european         European date formats (default)
-s,    --start-time=TIME   starting time
-z TZ, --time-zone=TZ      use TZ for timezone
-V,      --version         print version number, then exit


cronolog 一般是采取管道的方式来工作的,采用如下的形式:
# loggenerator | cronolog log_file_pattern

其中,loggenerator为产生log的程序,而log_file_pattern是日志文件的路径,可以在其中加入cronolog所支持的时间相关的pattern字符,如/www/log/%y/%m/%d/access.log。其pattern %为占位符,其后跟一特殊字符,简述如下:% 占位符后可跟下面的字符:
## 转义符
%    %字符
n    换行
t    水平制表符

## 时间域
H    小时(00..23)
I    小时(01..12)
p    该locale下的AM或PM标识
M    分钟(00..59)
S    秒 (00..61, which allows for leap seconds)
X    该locale下时间表示符(e.g.: "15:12:47")
Z    时区。若时区不能确定,则无意义

## 日期域
a    该locale下的工作日简名(e.g.: Sun..Sat)
A    该locale下的工作日全名(e.g.: Sunday ..  Satur-ay)
b    该locale下的月份简称(e.g.: Jan .. Dec)
B    该locale下的月份全称(e.g.:  January .. December)
c    该locale下的日期和时间(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    该locale下的日期表示(e.g. "13/04/97")
y    两位数的年份(00 .. 99)
Y    四位数的年份(1970 .. 2038)


(2)、结合apache使用
编辑httpd.conf文件,将其中的
[root@localhost ~]# vim /etc/httpd/httpd.conf
将默认日志:
CustomLog "logs/access_log" combined

修改为:
CustomLog "|/usr/local/sbin/cronolog /log/www/access_%Y%m%d.log" combined
其中%Y%m%d为日志文件分割方式,即为“年月日”。

[root@localhost ~]# service httpd restart

[root@localhost www]# ll
total 15072
-rw-r--r-- 1 root root   16028 Dec 26 15:16 access_20131225.log
-rw-r--r-- 1 root root 2406307 Dec 26 23:59 access_20131226.log
-rw-r--r-- 1 root root 8292792 Dec 27 23:59 access_20131227.log
-rw-r--r-- 1 root root 4682211 Dec 28 18:56 access_20131228.log


关键点在于: 被轮询的日志一定要是绝对路径,不能是相对路径。
老男孩学习笔记:





五、Windows 下使用Cronolog 轮询日志

Windows平台下也有 cronolog 对应的版本。我们下载Win32版本: cronolog-1.6.1.win32.zip
安装:
1、解压cronolog-1.6.1.win32.zip, 复制 cronolog.exe到 apache 的bin 目录。
2、编辑 httpd.conf
CustomLog "|bin/cronolog.exe D:/apache/logs/access_%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/apache/logs/error_%Y%m%d.log"

这句话可以取代主要的CustomLog语句,也可以在虚拟主机中使用,如:
<VirtualHost *:80>
ServerName www.xxx.com
CustomLog "|bin/cronolog.exe D:/apache/logs/xxxcom/access%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/apache/logs/xxxcom/error%Y%m%d.log"
</VirtualHost>

## Apache配置中即便是windows系统,目录分隔符也必须按照unix格式填写"/"而不是"\"
3、重启 apache

其实不管是在linux还是windows下,cronolog接受的日期格式都是“%Y%m%d%H%M“这样的格式。%Y表年,%m表月,%d表日,%H表小时,%M表分钟。只有使用这样的格式指定日志输出文件的名称,cronolog才会按日期、时间的变化生成新的日志文件。
然而,在Windows下需要分两种情况(刚在cronolog-1.6.1.win32所带的INSTALL说明中看到):
Configuration for use with NT service:
TransferLog "|c:/apache/bin/convlog.exe c:/apache/logs/access%Y%m%d.log"

Configuration for use from command line:
TransferLog "|c:/apache/bin/convlog.exe c:/apache/logs/access%%Y%%m%%d.log"

这是因为批处理机制所致,命令行必须用%%引用。

六、引入 rotatelogs (不推荐使用)

好了,到这里我们的cronolog工具就讲解完成了。有博友会问为什么不用apache自带的日志分割工具?apache自带的日志分割工具rotatelogs,据专家说在进行日志切割时容易丢日志,所以这里我们就用cronolog来做日志切割。=========== 华丽分割线 ===========

apache自带日志轮询工具rotatelogs(不推荐使用 rotatelogs 进行日志轮询)
■ rotatelogs 日志轮询
___________________________________________________________
ErrorLog "|/usr/local/apache1.3.33/bin/rotatelogs /logs/%Y%m%d.error.log 604800"
CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d..log 86400 480" combined
CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d..log 86400" combined
提示:也可以按照达到多大文件而轮询日志,此处就不提了。___________________________________________________________
■ 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文件大小滚动,而不是按照时间或时差滚动。
# 限制错误日志文件为 500M
#ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 500M"

# 每天生成一个错误日志文件
#ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400"

# 限制访问日志文件为 500M
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 500M" common

# 每天生成一个访问日志文件
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" common


在windows下, rotatelogs.exe有个坑儿。 当apache服务器运行时间久了之后,或者说日志文件过多时。 进程列表中会产生很多 rotatelogs.exe , 以及 cmd.exe 进程, 占用大量内存。而且他们不会停止,这是一个BUG

总结:不推荐使用 rotatelogs 进行日志轮询

参考:
tomcat: http://blog.csdn.net/mqboss/article/details/7466736 http://oldboy.blog.51cto.com/2561410/584513/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息