遊戲臨近上線,需要做乙個日誌系統,記錄玩家的行為,用途如下:
首先,用一台公共的伺服器左右日誌的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執行緒 寫檔案,程式執行速度太慢,尤其是當日誌資料比較多的時候,此時,我們可以使用乙個佇列,需要寫日誌時,將日誌加入佇列中,另外乙個專門的日...