一、最新專案給乙個需求:收集手機客戶端錯誤日誌
二、收集終端使用者日誌大體分為兩種解決方案:
1.單向逐條傳送給日誌服,即長連線、逐條傳送
2.以檔案形式基於某種觸發條件(如:使用者主動、bug檢測等)整體傳送給伺服器,即短連線、整體傳送
方案1 優點:是可以詳細的收集到使用者每個動態。
缺點:占用網路io,長連線消耗伺服器資源大,終端使用者流量消耗增加
方案2 優點:幾乎不占用網路io,發生錯誤才產生日誌,日誌有效性高
缺點:觸發條件基於終端使用者,不穩定
最終決定用方案2,因為此需求初衷是為了收集bug日誌,不需要過多占用使用者網路資源
三、設計思路
走tcp協議,winform做ui
客戶端:1.寫日誌
2.由使用者觸發傳送,並新增bug描述
3.讀取日誌,分包傳送
服務端:1.收集所有的包放進快取,收集完整後寫成檔案
2.接收超時後把已經收集到的日誌寫成檔案
3.釋放資源
四、協議設計
客戶端寫好日誌之後以4096為單位,將日誌分為若干個包體傳送給伺服器
互動資料報設計:
using word = system.uint16;
using byte = system.byte;
using dword = system.uint32;
using longlong = system.int64;
public class cmd_s_log
dwuserid,dwroomid,widenty 可以根據實際情況修改
wpakagecount :指客戶端傳送的日誌一共分了多少資料報,等收集夠了就寫日誌
llpakagelen:整個日誌位元組數
dwpakageindex:當前包是索引
wpakagerange:當前包大小,寫定4096
cbpakage:日誌包體
服務端核心**講解:
void start()
catch (exception ee)
}void accpet()
}catch (exception e)
thread.sleep(50);
}}
socketclient是本地封裝的乙個接收客戶端資料的socket類,下面給原始碼。
這段**很簡單,呼叫start()之後,繫結12345埠開啟監聽,然後啟動accept執行緒,接收到客戶端連線後交給socketclient來處理
socketclient:
public class socketclient
//開始接受資料
public void start()
//receive執行緒
void receive()
if (!checkdata())}}
catch (exception e)
thread.sleep(100);}}
//檢測資料完整性
bool checkdata()
if (isok)
}return true;}}
//寫檔案
bool writefile()
//初始化byte
byte filearray = new byte[m_logs[0].wpakagecount * 4096];
//拷貝記憶體
for (int i = 0; i < m_logs.length; i++)
//寫檔案
file.writeallbytes(path, filearray);
//寫成功
if (file.exists(path))
else
}//釋放記憶體
void relese()
//超時計時器
void timerun()
}
}//超時後讀取資料
void checkdata2()
if (isok)
}//超時後寫檔案
void writefile2()
//初始化byte
byte filearray = new byte[m_logs[0].wpakagecount * 4096];
//拷貝記憶體
for (int i = 0; i < m_logs.length; i++)
//寫檔案
file.writeallbytes(path, filearray);
//寫成功
if (file.exists(path))
}}
在前面建立socketclient物件,並開啟接收服務,接收到資料寫入資料佇列:m_receivehandler.handle
然後每寫入一次,就檢測一遍資料是否完整(這裡也可以開執行緒定時讀取資料佇列),如果資料完整就寫檔案,否則繼續接收,如果超時就寫入已經收集到的日誌。
資料佇列:
public class dfreceivehandler
}//讀取資料
public cmd_s_log getcmd()
}//清除資料佇列
public void clear()
}}
getcmd:獲取資料介面,判斷如果可以取出乙個cmd_s_log,不能就返回null
前面說過每次收到資料,就調檢測一遍資料完整性,檢測方法就是每次收到資料,讀取這個介面,如果能取出資料就快取起來,判斷是否收集完成
(ps:實際上開啟定時執行緒手機資料可能更安全一些)
快取寫成檔案:
//初始化byte
byte filearray = new byte[m_logs[0].wpakagecount * 4096];
//拷貝記憶體
for (int i = 0; i < m_logs.length; i++)
//寫檔案
file.writeallbytes(path, filearray);
這段**是把收集到的快取m_logs按順序拷貝進乙個filearray,然後一次性寫成檔案
客戶端:
但是要做的事情是一樣的
1.寫日誌
2.連線日誌服傳送日誌
寫日誌部分八仙過海,各顯神通
我這裡簡單舉個傳送日誌的例子(c#)
sendlogthread(string path)
//建立socket
socket m_socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
//ip port
ipaddress ipaddress = new ipaddress(m_ip);
int port = m_port;
endpoint point = new ipendpoint(ipaddress, port);
//連線伺服器
m_socket.connect(point);//建立連線
//迴圈傳送
int index = 0;
while (index < logs[0].wpakagecount)
//關閉連線
m_socket.close();
}}
伺服器專案放在csdn上了,客戶端內容少實現也簡單,大家自己搞定吧 檢視伺服器日誌
我們很樂意的借助於cnzz,51la等做 的統計,以獲得 執行一手資料的獲得。那伺服器日誌能做什麼呢?舉乙個例子。倘若一些被使用到某大流量 本來就不寬裕的 流量 經得起這樣的折騰啊!從原始日誌這裡就能找到流量大量流失的原因。但凡 出現異常,檢視 日誌總能找到蛛絲馬跡,因為伺服器日誌會自動記錄你的 網...
伺服器日誌排查
more命令,功能 類似 cat cat命令 是整個檔案的內容從上到下顯示在螢幕上。more more命令從前向後讀取檔案,因此在啟動時就載入整個檔案。1 命令格式 more dlfpcsu num pattern linenum file 2 命令功能 more命令和cat的功能一樣都是檢視檔案裡...
日誌伺服器設計
日誌伺服器設計 草稿 我的想方式實現乙個log伺服器,然後把所有日誌推向這個伺服器。同時相容現有的 rsyslog log4j,log4cpp.可以通過tcp udp 和管道,向日誌伺服器拋日誌。日誌伺服器,採用多執行緒處理,然後放入列隊。另乙個程序從列隊取日誌,然後進行過濾,通過特徵庫匹配。例如 ...