日誌實時監控 上傳

2021-07-11 19:21:12 字數 2702 閱讀 1785

摘要:日誌實時監控

關鍵字:common-io/monitor包,生產消費模式,非阻塞佇列,鉤子

看點:1.如何監聽檔案改變

common-io提供minitor工具,可以監控檔案的改變

file directory = new file(logpath);

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();

2.檔案改變後做什麼

檔案改變後應該獲取最新的改變內容,所以需要記錄上次讀完後的內容偏移量offset

public void onfilechange(file file)  else 

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

3.監聽改變與處理日誌的解耦

監聽到日誌馬上就處理最新的內容嗎?如果處理工作阻塞了怎麼辦?使用佇列解耦!採用生產者、消費者模式!!!

public class logupdprocessor implements runnable 

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)}}

}

4.監控程式對監控目標保持靜默

這個監控過程需要對監控物件的日誌保持靜默,不產生任何輸出,否則就會造成遞迴死迴圈的場景:日誌改變-監控捕獲-處理-產生日誌-日誌改變,所以任何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...