一、本文基於的環境:
操作系統:Linux(redhat)、Windows(XP、2003)
JDK版本:j2sdk<?xml:namespace prefix = st1 />_04
Tomcat版本:tomcat-
Cronolog版本:cronolog-.tar.gz
cronolog--win32.zip
本文修改後的tomcat都是按日保存日誌文件,文件格式如:catalina..out
二、cronolog的簡介(下載cronolog)
Cronolog是一款日誌輪循(rotation)工具,可以用它來把Apache、Tomcat等Web服務器上輸出的日誌切分成按日或月保存的文件。
Cronolog從標準輸入中讀取日誌內容,然後把它們寫到按指定格式命名的日誌文件中。日誌文件的名稱可以加入一段日期標記(如Catalina..out),當日期改變後Cronolog會把之前的日誌文件關閉,再打開一個包含新日期的日誌文件(如Catalina..out)。
利用Cronolog可以完美解決tomcat中的catalina.out日誌文件不斷增大,且不能在tomcat運行期間刪除的問題。
需要注意的一個問題是,日期改變後cronolog並不是馬上切換日誌文件,而是需要有新的日誌輸出才能觸發cronolog切換日誌文件。所以如果你想在刪除的日誌文件,如果從的00:00開始到你執行刪除時都沒有日誌輸出,則的日誌文件可能仍然被佔用着,導致刪除失敗。
三、Linux下使用Cronolog輪循(rotating)Tomcat日誌
(1)首先安裝cronolog(cronolog-.tar.gz放於/opt下)
cd /opt
gzip–d cronolog-.tar.gz
tar–xvf cronolog-.tar
cd cronolog-
./configure --prefix=/usr/local/cronolog //按自己需要指定安裝路徑,或不指定
make
make install
(2)修改Tomcat配置文件
先停止tomcat服務,然後修改以下文件:
%CATALINA_HOME%/bin/catalina.sh
將
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
替換爲:
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| /usr/local/cronolog/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &
另外刪除行:
touch "$CATALINA_BASE"/logs/catalina.out
修改完畢後重新啓動tomcat服務。
四、Windows下使用Cronolog輪循(rotating)Tomcat日誌
(1)安裝cronolog
解壓cronolog--win32.zip,將cronolog.exe文件拷貝到Tomcat的bin目錄下。
(2)修改Tomcat配置
在Windows下,tomcat默認是把日誌內容直接輸出到控制檯的,而不是保存在catalina.out文件,所以要先修改爲把日誌內容輸出到文件。
首先修改%CATALINA_HOME%/bin/startup.bat,將
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
替換爲:
call "%EXECUTABLE%" run %CMD_LINE_ARGS%
然後修改%CATALINA_HOME%/bin/catalina.bat,將
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
替換爲:
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% |%CATALINA_BASE%\bin\cronolog %CATALINA_BASE%\logs\catalina.%date:~0,10%.out >> null (應該是catalina.%%Y-%%m-%%d.out)
goto end
:doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% |%CATALINA_BASE%\bin\cronolog %CATALINA_BASE%\logs\catalina.%date:~0,10%.out >> null (應該是catalina.%%Y-%%m-%%d.out)
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% |%CATALINA_BASE%\bin\cronolog %CATALINA_BASE%\logs\catalina.%date:~0,10%.out >> null (應該是catalina.%%Y-%%m-%%d.out)
goto end
:doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% |%CATALINA_BASE%\bin\cronolog %CATALINA_BASE%\logs\catalina.%date:~0,10%.out >> null (應該是catalina.%%Y-%%m-%%d.out)
goto end
修改完之後重新啓動tomcat。
用於Windows環境的補充(2009-06-13):
寫這篇文章的時候,在Windows下的配置還沒有測試過,其實上面的寫法是錯誤的!之前在windows下日誌文件名使用“catalina.%Y-%m-%d.out”的方式生成的日誌文件變成“catalina.md.out”的樣子,並不是日期!然而使用上面的“catalina.%date:~0,10%.out"得出的文件名是“catalina.2009-06-13.out",其中的日期是tomcat啓動時的日期,但是日誌文件並不會隨着日期改變而輪循(rotating)!
其實不管是在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"
也就是說,如果是通過命令行方式來啓動tomcat的話,日誌文件名的寫法必須是“catalina.%%Y-%%m-%%d.out”纔是正確的。