目的java中的pipe或BufferedReader可能會丟失數據嗎?
要閱讀所有的Apache服務器和存儲日誌上S3
背景
我們有以下的httpd.conf
ErrorLog "| /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/java -cp /usr/local/bin/CustomProducer/producer-1.0-SNAPSHOT-jar-with-dependencies.jar stdin.producer.StdInProducer /usr/local/bin/CustomProducer/Config.json >> /var/log/producer_init.log 2>&1"
這使得語句登錄error_log
文件以及標準輸出將由java生產者爲Apache kafka使用
該生產者最終將數據發送到kafka集羣,然後是amazon S3。
的error_log
文件被旋轉,然後也使用存儲在S3 logrotate
生產者代碼
this.stdinReader = new BufferedReader(new InputStreamReader(System.in));
try {
while ((msg = this.stdinReader.readLine()) != null) {
//Some processing which may introduce some delay
//Send message to cluster
this.producer.send(message);
}
}
問題
當每小時日誌從卡夫卡桶和logrotate的桶相比有些日誌間歇性缺失,沒有特定的模式或時間。
是否可能由於pipe
限制或BufferedReader
限制?有什麼方法可以找到答案?
只是一個想法。當涉及到一個普通的linux管道時,最慢的管道使用者通常會阻止生產者的輸出,這可能不是整個Apache日誌子系統和/或ErrorLog指令的特例。 – Osw