[英]Garbage collector log (loggc) file rotation with logrotate does not work properly
使用帶有Linux logrotate命令的JVM垃圾收集日志選項時,我遇到了一個奇怪的問題。 執行旋轉時,它將NUL(^ @)值填充為作為JVM參數給出的文件的第一行。
假設這是java調用(Test.class位於/ home / test /):
java -Xloggc:/home/test/test.log -cp / home / test / Test
該文件的logrotate配置如下:
/home/test/test.log {
旋轉56
missingok
notifempty
copytruncate
nocreate的
nomail
}
為了測試目的,我每分鍾都有一個crontab條目記錄:
* / 1 * * * * / usr / sbin / logrotate -f /etc/logrotate.d/gcLog
我得出的結論是JVM寫入追加模式並保留某種偏移用於在相關文件中寫下一行,即使文件被logrotate截斷(我可能錯了)。
我的下一個想法是嘗試將stdout重定向到test.log文件。 我使用了這個java調用並為logrotate和cron保留了相同的配置:
java -verbose:gc -cp / home / test / Test> /home/test/test.log
再次,當log.ate截斷test.log時,新創建的文件在第一行填充NUL(^ @)值。
沒必要說我沒有找到任何有用的谷歌。 我發現了另一個關於stackoverflow類型的問題,但我無法設置Java Script Wrapper,所以這不起作用。
有人遇到過這個問題嗎? 知道為什么會這樣嗎? 更好,任何變通方法或解決方案? 我需要嘗試將對應用程序的調用傳遞給讀取輸出的某個腳本,並且可能看看Tomcat在catalina.out中記錄和旋轉stdout的方式(這里也會非常感謝一些幫助)
我們在運行Jboss7和Java6的地方遇到了同樣的問題,我們在GC文件中得到了NULL並且它們一直在增長。
解決方案是將GC記錄到stdout,然后將 stdout 附加到文件:
簡單的例子:
java -verbose:gc >> console.log
顯然使用append(>>)擺脫了文件中某個位置的Java“指針”。 還有一個額外的好處就是沒有重置每個服務器的GC日志,所以我們可以隨着時間的推移得到一些統計數據。
至少IBM PMAT工具在使用GC輸出解析sysout時沒有問題。
最簡單的解決方案有時是最好的:)
雖然我希望Java支持轉換GC日志,但我看到有人之前一直在討論: http : //mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html
為了解釋null,Java維護一個內部引用來計算縮進的位置,當你移動文件時,它會導致將空字符寫入日志。
我已經看到篡改GC日志文件導致系統崩潰,在寫入日志文件時導致的中止被忽略(請參閱此處的代碼http://pastebin.com/HWkNv3PM )導致JVM繼續忽略錯誤。
當文件重新打開時,我相信位置計數器沒有被重置。
至於如何滾動日志文件的其他想法 - 另請參閱: 在java中滾動垃圾收集器日志
而不是java -verbose:gc >> console.log我可以這樣做:java -Xloggc:logs / gc.log >> console.log所以輸出將保存在一個文件中,然后還可以旋轉到console.log?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.