一、安裝環境說明
系統環境:
操作系統 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/