c 單向日誌伺服器

2021-08-18 11:52:58 字數 3807 閱讀 1666

一、最新專案給乙個需求:收集手機客戶端錯誤日誌

二、收集終端使用者日誌大體分為兩種解決方案:

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 和管道,向日誌伺服器拋日誌。日誌伺服器,採用多執行緒處理,然後放入列隊。另乙個程序從列隊取日誌,然後進行過濾,通過特徵庫匹配。例如 ...