Related Posts Plugin for WordPress, Blogger...

6-4 Log4Net In Photon Server

本章要來設定Photon Server的Log功能,如之前的文章中有向大家介紹如何觀看Log紀錄,今天要教大家如何在程式中使用Log4Net產生自己的紀錄,方便往後的Debug作業。

首先,專案必須引入兩個dll檔,ExitGames.Logging.Log4Net.dll與log4net.dll,如果有人不知道Photon提供的dll檔在哪,或是不知道該怎麼引入dll檔的話,請先看以前的文章唷。
6-2 Create A Photon Server Project And Import Library


引入完之後,我這邊直接從Photon提供的範例中,複製log4net的設定檔案,檔案位置在src-server/Mmo/Photon.MmoDemo.Server/log4net.config。

接著修改裡面的內容,主要是將Log的檔案名稱改成自己想要的名稱,在第五行的後面。

如下提供我的log4net.config內容:




  
    
    
    
    
    
      
    
  

  
    
      
    
    
      
      
    
  

  
  
    
    
    
  

  
    
  




修改完以後,在專案的log4net.config點右鍵選擇Properties。

修改Copy to output directory的設定為Always copy,每次Build專案時都會將此設定檔複製到輸出資料夾。

接著撰寫程式碼,以下提供我的主類別與MyClinetPeer.cs的程式碼:
NoliahFantasyServer.cs:

using System;
using System.IO;
using Photon.SocketServer;
using ExitGames.Logging;
using ExitGames.Logging.Log4Net;
using log4net.Config;

namespace NoliahFantasyServer
{
    public class NoliahFantasyServer : ApplicationBase
    {

        private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
        public NoliahFantasyServer()
        {
        }

        // 當Client端發出Request的時候
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            return new MyClientPeer(initRequest);
        }

        // Server端啟動的時候初始化
        protected override void Setup()
        {
            LoggerInit();
        }

        // Server端關閉的時候
        protected override void TearDown()
        {
        }

        void LoggerInit()
        {
            // 日誌初始化
            log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] = 
                Path.Combine(this.ApplicationRootPath, "bin_Win64", "log");
            FileInfo loggerConfig = new FileInfo(Path.Combine(this.BinaryPath, "log4net.config"));
            if (loggerConfig.Exists)
            {
                // 設置使用log4net的Log功能
                LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
                // 讓log4net讀取config
                XmlConfigurator.ConfigureAndWatch(loggerConfig);
            }
            logger.Info("Setup Log4Net Compeleted!");
        }
    }
}


MyClientPeer.cs:

using System;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;

namespace NoliahFantasyServer
{
    public class MyClientPeer : ClientPeer
    {
        public MyClientPeer(InitRequest initRequest) : base(initRequest)
        {
        }

        // Client端斷開連結的時候
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
        }

        // 處理Client的Request請求
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
        }
    }
}


寫好以後按下Build/Build All,專案就會開始編譯了。
 編譯完以後產生如下圖的資料,這些資料都需要複製到PhotonServer上交付執行。

上傳完畢,要給PhotonServer執行的程式都要在deploy底下,NoliahFantasy則是我自定義的Application名稱,然後統一放在bin的下面。

完成了以後還不能啟動,因為我們還沒有編輯PhotonServer.config檔案,由於設定檔的解說在前面的章節已詳細說明過了,不再贅述。下列提供我的設定原始碼:





 
    
 

  
  
  
   
   
   
   
   
  
  
    
  
   
   
   
   
   
   
   
   
   
   
  
  
  
  
    
    
    
    
    
  

  
  
  
   
   
   
   
   
   
  

  
  
  

  
  
    
   
   
   
   
   
   
   
    
  
  
 
 
 
 
 
  
  
  
  
   
   
  
    
  
  
   
  
   
   
  

  
  
    
    
    
    
    
  

  
  
   
   
  

  
  
  
    

  
  
  
  
   
   
   

   
   
    

  
 
 
 
 
  
  
  
   
   
  
    
  
  
   
  
   
   
  

  
  
  
    

  
  
  
  
   
   
    

  
 




修改完以後,開啟Photon的控制中心,就會發現Photon instances中多出了我們定義的NoliahFantasyServer選項,選擇Start as application。假如在啟動Application時出了問題,有可能是你的PhotonServer.config檔案設定錯誤,請再檢查是否有哪個值設定的不對。

此時來到deploy/bin_Win64/log底下,會出現我自定義的NoliahFantasy.Server檔案,當程式邏輯有Bug時便能透過這個檔案進行測試。另外,還有一個類似名稱的檔案Photon-NoliahFantasyServer-20180505,這是Photon預設的啟動Application時的Log檔,如果在啟動時就出現問題的話,請看這個Log。

最後,我們的Log裡面有出現“Setup Log4Net Completed!”字樣,代表成功了。

留言

  1. 想請問一下,我在建置之後沒有出現PhotonHostRuntimeInterfaces.dll,請問有可能是我哪個部分做錯嗎?還是說我也可以直接從當初參考的地方直接拿來用?

    回覆刪除
    回覆
    1. 應該可以唷~我的Visual Studio可能自動幫我輸出PhotonHostRuntimeInterfaces.dll到目的資料夾。檔案應該都是同一個。

      刪除

張貼留言