摘要:日誌實時監控
關鍵字:common-io/monitor包,生產消費模式,非阻塞佇列,鉤子
看點:1.如何監聽檔案改變
common-io提供minitor工具,可以監控檔案的改變
file directory = new file(logpath);2.檔案改變後做什麼long interval = timeunit.seconds.tomillis(3);
filefilter filefilter = filefilterutils.or(filefilterutils.namefilefilter("async_task.log"),
filefilterutils.namefilefilter("error.log"),
filefilterutils.namefilefilter("moviebar_local.log"),
filefilterutils.namefilefilter("push-message.log"));
filealterationobserver observer = new filealterationobserver(directory, filefilter);
fileincrelistener listener = new fileincrelistener();
observer.addlistener(listener);
initreadmark(directory.listfiles(filefilter), listener);
filealterationmonitor monitor = new filealterationmonitor(interval,observer);
monitor.start();
檔案改變後應該獲取最新的改變內容,所以需要記錄上次讀完後的內容偏移量offset
public void onfilechange(file file) else3.監聽改變與處理日誌的解耦long readlength = filelength - readoffset;
inputstream = new fileinputstream(file);
outputstream = new bytearrayoutputstream();
ioutils.copylarge(inputstream, outputstream, readoffset, readlength);
readmark.put(filepath, file.length());
byte increbyte = outputstream.tobytearray();
if(increbyte.length >= 1024 * 1024 * 1)
string increcon = new string(increbyte);
mapparams = new hashmap<>();
if(bar != null)
params.put("filename", file.getname());
params.put("increcon", increcon);
logupdprocessor.offer(params);
}}catch (exception e) finally
監聽到日誌馬上就處理最新的內容嗎?如果處理工作阻塞了怎麼辦?使用佇列解耦!採用生產者、消費者模式!!!
public class logupdprocessor implements runnable4.監控程式對監控目標保持靜默if(!constants.uoload_log_switch)
return
logmessagequeue.offer(map);
}public static map poll()
public static int queuesize()
@override
public void run()
map params = logmessagequeue.poll();
if(params == null) catch (interruptedexception e)
}else
}catch (exception e)}}
}
這個監控過程需要對監控物件的日誌保持靜默,不產生任何輸出,否則就會造成遞迴死迴圈的場景:日誌改變-監控捕獲-處理-產生日誌-日誌改變,所以任何log,catch都不輸出
5.對offset的維護(初始化,新建,增加,減少)
當程式啟動時,offset初始為null,要二次更新時才能獲取更新內容,存在訊息丟失的情況!
故而當初始化時,offset置為file.length(),日誌建立時同理
當日誌減少時,offset小於length,會有讀異常,相容下
6.上傳的開關與上傳大小控制
上傳增加開關,可控制
上傳size做下限制,不能無限量上傳
7.jvm退出前清掃佇列(鉤子)
為了保證訊息不丟失,在jvm退出前clean日誌佇列
runtime.getruntime().addshutdownhook(cleanlogthread);8.雲端簡述
伺服器端,同樣可以採取生產者、消費者模式,訊息到達時入佇列,有其他執行緒完成日誌後續處理工作
可提高伺服器端吞吐能力
使用less實時監控日誌
檢視日誌 less var log messages ctrl f向前翻頁 ctrl b向後翻頁 搜尋關鍵字 less intel var log messages n鍵向前繼續顯示搜尋結果 shift n鍵向後復看搜尋結果 less本身也支援類似於tail f的操作,就是在你用less開啟乙個檔案...
細述 GoAccess實時日誌監控
本文章基於ubuntu16.04系統 nginx1.10.3日誌環境 注 nginx使用apt get方式安裝,日誌格式為預設 原始碼安裝 apt get install gcc g libncursesw5 dev wget tar xzvf goaccess 1.2.tar.gz cd goac...
spark 歷史和實時任務日誌監控
一.spark on yarn historyserver 執行完畢日誌 1.配置yarn日誌引數 yarn site.xml yarn.log aggregation enable true yarn.log.server.url 修改spark的spark defaults.conf spark...