遊戲日誌系統設計與實現

2021-08-11 21:26:20 字數 4324 閱讀 5036

遊戲臨近上線,需要做乙個日誌系統,記錄玩家的行為,用途如下:

首先,用一台公共的伺服器左右日誌的db伺服器,所有遊戲中產生的日誌,都往這個db中寫;

然後,查詢系統需要乙個後端,與前端互動,來處理查詢邏輯,反饋資料;

最後,需要乙個前端,提交查詢條件,展示查詢結果。

在網易無論手遊還是端遊,基本上都是用mongo,出來之後遊戲資料庫也就用了mongo,在我看來主要基於兩個優點:

遊戲需求多變,mongo直接寫json,省去需要建表改表的麻煩;

對於遊戲資料庫,無須完成邏輯,只要存資料就好,用不上覆雜的sql語句;

系統後端直接用了nodejs,主要是基於經驗和前端考慮,因為之前用nodejs和python寫過http伺服器,可選的就是這兩個了,加上前端用的網頁,前後端統一就都用js了。

// dao.js

var mongoclient =

require

('mongodb'

).mongoclient;

var strutils =

require

("./strutils");

vartimeout

=3000

;// 毫秒

function

getconnstr

(host, port, rpsetname, dbname)

:/?connecttimeoutms=&replicaset="

, host, port, dbname,

timeout

, rpsetname);}

;function

finddocuments

(conditions, db, col, startindex, rows, callback)).

skip

(startindex)

.limit

(rows)

; cursor.

toarray

(function

(err, docs)

cursor.

count

(false

,function

(err, count)

callback

(docs, count);}

);})

;}function

findrecord

(host, port, rpsetname, dbname, colname, conditions, startindex, rows, callback)

else);

}});

}exports.findrecord = findrecord;

考慮到這個工具會時常更新,多方會用到,用客戶端的話,用網頁比較合適,更新之後重新整理就可以了。

關於日誌的顯示的**,用了乙個 jqeruy 的外掛程式 jqgrid ,關於使用可以參考下我之前寫過的部落格。

這裡有點技巧就是列名需要動態的獲取,否則就要在客戶端寫很多grid模板了,主要**如下:

// log.js

function

creategrid

(colnames, colmodel, url)

;var options =}}

;var grid =$(

"#grid");

grid.

jqgrid

(options);}

function

getcolmodel

(colnames, colwidth));

}return colmodel;

}function

geturlargs

(getcol, i***port);if

(getcol)

else

return args;}}

function

onclickquery()

var colnames = jsondata.colnames;

var colwidth = jsondata.colwidth;

if(colnames && colnames.length)

else},

"json");

}

另外,前端還有個匯出csv的小功能,**如下:

// export

// 參考:

function

jsontocsvconvertor

(arrdata, title)

colnames = colnames.

slice(0

,-1)

;csv

+= colnames +

'\r\n'

;// 資料

for(

var i =

0; i < arrdata.length; i++

) line.

slice(0

, line.length -1)

;csv

+= line +

'\r\n';}

if(csv==='')

var filename = title.

replace

(/ /g

,"_");

var uri =

'data:text/csv;charset=utf-8,\ufeff'

+encodeuricomponent

(csv);

var link = document.

createelement

("a");

link.href = uri;

link.style =

"visibility:hidden"

; link.download = filename +

".csv"

; document.body.

(link)

; link.

click()

; document.body.

removechild

(link)

;}

同樣也用nodejs簡單地實現了乙個,省去配置apache或nginx的麻煩,**如下:

);最後上截圖:

注意:

js跨域問題,處理起來要小心

mongo分頁查詢skip,當資料過多時,會很慢

利用shell指令碼對遊戲日誌資訊的提取

日誌儲存為文字檔案,我們在查詢所需要的資訊的時候,一般會用到grep egrep等等的命令,比如 grep 大鵬 log scene 就可以檢索出大鵬作為關鍵字的相對應的資訊。關於grep等命令的使用,這 有詳細的介紹,但是,簡單的採用grep命令可能不能滿足我們的需求,我在工作的過程中就遇到了這樣...

C 遊戲日誌(六)A 尋路法,簡單,詳細注釋

乙個遊戲中最常見的尋路演算法 每個點有四個屬性,開始將起點存入開表。一 迴圈每次找出開表中f值 g h 最小的點存入閉表,並刪除開表中的點。二 以此點為基礎進行四方向尋路 也可以寫八方向 三 五個判斷一次進行 是否越界,是否碰牆,是否走到終點 直接跳出 是否在閉表,是否在開表 資料更新 四 之前判定...

日誌系統實現

一 使用原因 在實現高併發的伺服器日誌系統過程中,由於在工作執行緒中直接進行io操作,相比較於高速的cpu,io磁碟操作是很慢的,直接在某些工作執行緒 包括ui執行緒 寫檔案,程式執行速度太慢,尤其是當日誌資料比較多的時候,此時,我們可以使用乙個佇列,需要寫日誌時,將日誌加入佇列中,另外乙個專門的日...