在遊戲開發的過程當中,咱們須要記錄一些日誌,以便之後瞭解遊戲運行的狀況,以及根據日誌發現並處理遊戲中的突發狀況。
一,遊戲日誌能夠分爲如下幾種:
1)系統日誌
2)用戶操做日誌
3)異常日誌,即錯誤日誌
系統日誌
系統日誌通常描述的是服務器平常運行的狀態。好比啓動是否成功,天天統計一下內存的佔用量,CPU的使用量等信息。用於查檢服務器運行的健康情況。這對於技術分析來講是很是重要的。若是沒有這些信息,一但服務器宕機,咱們就兩眼一抺黑,不知從何下手了。這部分日誌通常產生的文件不大,內容不是太多,能夠記錄成文本形式,以備查看。若是須要存儲到數據庫中,或使用工具查看,則須要定義好日誌的格式,以方便解析。
用戶日誌
遊戲服務器的核心就是用戶的日誌。用戶日誌能夠分爲幾大類:登錄日誌;消費日誌,收入日誌,行爲日誌,充值日誌。
1,登錄日誌
主要記錄玩家登錄的時間,IP等信息。登錄日誌能夠用於判斷客戶端的狀態。識別使用軟件進行不正常的大規模訪問。好比,頻繁的登錄斷開。這會給服務器形成額外的壓力。使正常的玩家受到影響,有時候嚴重的,不能正常登錄。管理員能夠根據這些信息,對此客戶端的IP進行封號處理。
2,消費日誌
主要記錄玩家在遊戲中各類貨幣的消費狀況。根據這些信息,能夠分析玩家大部分資金的流向,對運營的營銷有很大的幫助。還能夠根據這些信息,查看服務器系統中是否存在一些刷錢的BUG。由於一我的無限的能夠購買一個物品明顯是不正常的。根據這些日誌,能夠很快定位到哪一個功能致使了這種狀況的發生。
3,收入日誌
主要記錄玩家在遊戲中的貨幣來源狀況。也是遊戲系統整個產出的表現。便於數值對整個遊戲的產出狀況作一個全面的瞭解。也有助於發現系統的BUG,由於一我的的資金忽然比別的玩家高出了不少是不正常的。根據這些日誌,能夠定位到是哪一個功能致使了這種異常的增加。
4行爲日誌
主要記錄玩家的一些操做行爲,好比抽卡次數,挑戰次數,購買次數等信息。分析玩家在遊戲成長過程當中的行爲。根據這些日誌,能夠修改遊戲的某些小功能,增長用戶體驗的好感。
5充值日誌
主要記錄玩家的充值信息。這是很是重要的,若是一個玩家充值,錢扣了,可是鑽石沒發給人家,是要給人家一個說法的。充值日誌能夠直接反映出哪些玩家是土豪,清楚遊戲收入的來源。
異常日誌
主要記錄在遊戲服務器中程序發生的異常。有些BUG在測試環境中是很難測試到的。記錄程序中的異常,能夠定位程序中BUG的位置,清楚BUG產生的緣由。對遊戲服務器的改進提供必要的支持。
二
遊戲日誌存儲的方式
由於日誌的存儲是一種IO密集的操做,若是在遊戲邏輯中處理不當,會形成遊戲邏輯處理緩慢,給玩家的體驗帶來很差的影響。日前經常使用的日誌存儲工具是log4j,主要是把日誌存儲到文本文件中,關於log4j的使用,咱們在另一篇文章中再詳述。今天咱們聊聊把日誌入庫的操做。在日誌入庫以前,必定要定義好日誌的格式,方便解析入庫。好比登錄日誌,須要記錄的信息由:用戶id,IP,登錄時間等,能夠把這些字段寫在一個對象裏面,而後用轉化爲JSON字符串。
通常來講,日誌與遊戲的實時性關聯不大。咱們能夠把日誌的入庫操做作一個單獨的進程開發。讓它運行在另一臺與遊戲邏輯服務器分開的物理機器上。這樣能夠減小對遊戲邏輯服務器資源的佔用,減輕邏輯服務器的壓力。實現的方式也很簡單。在遊戲邏輯服務器初始化一個隊列:
java
</pre><pre name="code" class="java">import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class LogManager { // 日誌緩存隊列 private final static BlockingQueue<String> LOG_QUEUE = new LinkedBlockingQueue<String>(); public static void put(String log) { try { LOG_QUEUE.put(log); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static String get() { try { return LOG_QUEUE.take(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
在服務器啓動的時候,啓動一個線程,從這個日誌緩存隊列中取出日誌,以Socket的方式發送到日誌服務器。日誌服務器接收傳送過來的日誌。由於日誌服務器要把日誌寫入到數據庫中,爲了訪止大規模的寫入,致使數據庫鏈接資源消耗完,在日誌服務器也創建一個緩存隊列,把日誌先放到緩存隊列中。另外再開啓若干個線程鏈接數據庫,並從緩存隊列中取出日誌數據,寫入到日誌數據庫中。在日誌數據庫中,日誌的表按天存儲,也就是一天一個表,由程序自動完成。因爲日誌的數據量很是龐大,能夠把數據庫中過期比較長的數據備份並刪除,也能夠作大數據化處理數據庫