日誌切割輪詢技術(cronolog and rotatelogs)

一、安裝環境說明

系統環境:


二、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


關鍵點在於:  被輪詢的日誌一定要是絕對路徑,不能是相對路徑。

老男孩學習筆記:


220054954.jpg

215951976.jpg

五、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/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章