Browse Source

【优化】增加玩家信息打印模块 & 修改部分日志的等级

meijun 3 năm trước cách đây
mục cha
commit
cd8e1ddb38

+ 2 - 0
Common/CommonAI/CommonAI.csproj

@@ -103,6 +103,8 @@
     <Compile Include="ZoneClient\ZoneObject.Unit.cs" />
     <Compile Include="ZoneClient\ZoneObject.Unit.Status.cs" />
     <Compile Include="ZoneServer\JSGModule\JSGGlobalData.cs" />
+    <Compile Include="ZoneServer\JSGModule\JSGHackerModule.cs" />
+    <Compile Include="ZoneServer\JSGModule\JSGSrvData.cs" />
     <Compile Include="ZoneServer\JSGModule\MSpaceNodeCache.cs" />
     <Compile Include="ZoneServer\JSGModule\JSGModule.cs" />
     <Compile Include="ZoneServer\JSGModule\JSGServerProfile.cs" />

+ 7 - 4
Common/CommonAI/Zone/Formula/IFormulas.cs

@@ -13,6 +13,7 @@ using CommonLang.XCSV;
 using static CommonAI.Zone.Instance.InstanceUnit;
 using CommonAI.Data;
 using CommonAI.Zone.Helper;
+using CommonAI.ZoneServer.JSGModule;
 
 namespace CommonAI.Zone.Formula
 {
@@ -317,12 +318,14 @@ namespace CommonAI.Zone.Formula
 		void SetSkillActive(int skillTemplateID, bool active, bool pause_on_deactive = false);
 		/** 分发击杀怪物事件 */
 		bool DispatchKillOtherEvent(IVirtualUnit attacker, IVirtualUnit deader);
-		/////////////////////////////////////////////////////////////////////////////
+        /** 获取玩家当前的简要属性信息 */
+        UnitSimpleProp GetSimpleProp();
+        /////////////////////////////////////////////////////////////////////////////
 
 
-		/////////////////////////////////////////////////////////////////////////////
-		//怪物的一些接口暴露给comAI
-		int GetMaType();
+        /////////////////////////////////////////////////////////////////////////////
+        //怪物的一些接口暴露给comAI
+        int GetMaType();
 		bool IsBoss();
 		uint GetMasterID();
 		InstanceUnit GetMasterUnit();

+ 6 - 0
Common/CommonAI/Zone/Instance/InstanceUnit.cs

@@ -19,6 +19,7 @@ using CommonAI.Zone.Instance.Helper;
 using CommonAI.Data;
 using static CommonAI.Zone.UnitInfo;
 using CommonAI.data;
+using CommonAI.ZoneServer.JSGModule;
 
 namespace CommonAI.Zone.Instance
 {
@@ -851,6 +852,11 @@ namespace CommonAI.Zone.Instance
             {
                 log.Info("boss死亡:" + this.mProcessDeadCallbackTime + ", 单位id=" + this.Info.ID + ", 场景Id=" +
                     this.Parent.GetSceneID() + ", " + this.mZone.UUID + ", " + (attacker == null ? "null" : attacker.PlayerUUID));
+
+                if(attacker.IsPlayerUnit)
+                {
+                    JSGHackerModule.OnPlayerKillMonster(attacker, this);
+                }
             }
 
             mDeadTime = Parent.PassTimeMS;

+ 15 - 5
Common/CommonAI/Zone/Instance/InstanceZone.cs

@@ -1141,6 +1141,8 @@ namespace CommonAI.Zone.Instance
         {
             private class DirtyList<K, T> where T : InstanceZoneObject
             {
+                private static Logger log = LoggerFactory.GetLogger("DirtyList");
+
                 private bool dirty = true;
                 private List<T> mObjectsCollection = new List<T>();
                 private HashMap<K, T> mObjects = new HashMap<K, T>();
@@ -1182,13 +1184,21 @@ namespace CommonAI.Zone.Instance
                 }
                 public IEnumerable<T> GetCollection()
                 {
-                    if (dirty)
+                    try
+                    {
+                        if (dirty)
+                        {
+                            dirty = false;
+                            mObjectsCollection.Clear();
+                            mObjectsCollection.AddRange(mObjects.Values);
+                        }
+                        return mObjectsCollection;
+                    }
+                    catch(Exception err)
                     {
-                        dirty = false;
-                        mObjectsCollection.Clear();
-                        mObjectsCollection.AddRange(mObjects.Values);
+                        log.Warn("GetCollectioncatch:" + mObjectsCollection.Count + ", e:" + err);
                     }
-                    return mObjectsCollection;
+                    return mObjects.Values;
                 }
             }
 

+ 5 - 0
Common/CommonAI/ZoneClient/Messages.cs

@@ -40,6 +40,11 @@ namespace CommonAI.ZoneClient
                 this.PassTime = input.GetVS32();
                 this.OverlayLevel = input.GetU8();
             }
+
+            public override string ToString()
+            {
+                return "[" + BuffTemplateID + ", " + TotalTime + ", " + PassTime + ", " + OverlayLevel + "]";
+            }
         }
         public struct UnitSkillStatus : IExternalizable
         {

+ 52 - 0
Common/CommonAI/ZoneServer/JSGModule/JSGHackerModule.cs

@@ -0,0 +1,52 @@
+using CommonAI.Data;
+using CommonAI.Zone;
+using CommonAI.Zone.Formula;
+using CommonAI.Zone.Helper;
+using CommonAI.Zone.Instance;
+using CommonLang.Log;
+using CommonLang.Vector;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using static CommonAI.ZoneClient.ClientStruct;
+//using System.Threading.Tasks;
+
+namespace CommonAI.ZoneServer.JSGModule
+{
+	public class JSGHackerModule
+	{
+		protected static readonly Logger log = LoggerFactory.GetLogger("JSGHackerModule");
+		public static void OnPlayerKillMonster(InstanceUnit attacker, InstanceUnit monster)
+        {
+#if JSGProfile
+            try
+            {
+				InstancePlayer player = (InstancePlayer)(attacker.IsPlayer ? attacker : attacker.Virtual.GetMasterUnit());
+				if (player == null)
+				{
+					log.Debug("OnPlayerKillMonster player not exist:" + attacker.PlayerUUID + ", " + attacker.Info.ID + ", SceneId:" + attacker.Parent.GetSceneID());
+					return;
+				}
+				UnitSimpleProp simpleProp = player.Virtual.GetSimpleProp();
+				//玩家属性打印
+				log.Debug("--------OnPlayerKillMonster print start:" + player.PlayerUUID + ", " + attacker.Parent.GetSceneID());
+				log.Debug("当前血:" + simpleProp.mCurHp + ", 攻防血" + simpleProp.mAtk + ", " + simpleProp.mDef + ", " + simpleProp.mMaxHP + ", 妖:" + simpleProp.mMonsterAtk + ", " + simpleProp.mMonsterDef);
+
+				UnitBuffStatus[] buffStatus = player.GetCurrentBuffStatus();
+				if(buffStatus != null)
+                {
+					foreach(UnitBuffStatus buffItem in buffStatus)
+                    {
+						log.Debug("玩家buff:" + buffItem.ToString());
+					}
+                }
+			}
+			catch(Exception e)
+            {
+				log.Warn("OnPlayerKillMonster catch:", e);
+            }			
+#endif
+		}
+	}
+}

+ 26 - 0
Common/CommonAI/ZoneServer/JSGModule/JSGSrvData.cs

@@ -0,0 +1,26 @@
+using CommonAI.Data;
+using CommonAI.RTS;
+using CommonAI.RTS.Manhattan;
+using CommonAI.Zone;
+using CommonAI.Zone.Helper;
+using CommonLang;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using static CommonAI.RTS.Manhattan.AstarManhattan;
+using static CommonAI.RTS.Manhattan.AstarManhattan.MSpaceAStar;
+//using System.Threading.Tasks;
+
+namespace CommonAI.ZoneServer.JSGModule
+{
+	public class UnitSimpleProp
+	{
+		public long mCurHp;
+		public long mMaxHP;
+		public long mAtk;
+		public long mDef;
+		public long mMonsterAtk;
+		public long mMonsterDef;
+	}
+}

+ 1 - 1
Common/CommonAIServer/Node/ZoneNode.cs

@@ -645,7 +645,7 @@ namespace CommonAIServer.Node
                             ObjectAction oa = message as ObjectAction;
                             if (oa != null)
                             {
-                                BaseZoneNode.log.Debug("C2B msg<<<" + oa);
+                                //BaseZoneNode.log.Debug("C2B msg<<<" + oa);
                                 oa.object_id = mActor.ID;
                                 oa.sender = mActor;
                                 if (oa is ActorRequest)

+ 1 - 1
Common/Pomelo/PomeloShare/FastStream_old.cs

@@ -842,7 +842,7 @@ namespace Pomelo
             FastStreamSession socket = connetorId as FastStreamSession;
             Composer composer = new Composer(uid, instanceId,data);
             byte[] sendData = composer.getBytes();
-            log.Debug("player:" + uid + " socket.Send");
+            //log.Debug("player:" + uid + " socket.Send");
             socket.Send(sendData, 0, sendData.Length);
 
         }

+ 1 - 1
Common/Pomelo/PomeloShare/IceManager.cs

@@ -37,7 +37,7 @@ namespace Pomelo
 
         public void trace(string category, string message)
         {
-            this.logger.Debug(message);
+            //this.logger.Debug(message);
         }
 
         public void warning(string message)

+ 1 - 1
Common/Pomelo/PomeloShare/ZoneManagerI.cs

@@ -93,7 +93,7 @@ namespace Pomelo
                     {
                         cb__.ice_response();
                     }
-                    log.Debug("playerEnter end:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
+                    //log.Debug("playerEnter end:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
 
                 });
             } catch (System.Exception e)

+ 29 - 38
Common/Pomelo/PomeloShare/log4net

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <log4net>
     <appender name="errorAppender" type="log4net.Appender.RollingFileAppender">
+	<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
         <filter type="log4net.Filter.LevelMatchFilter">
             <levelToMatch value="ERROR" />
         </filter>
@@ -9,83 +10,73 @@
         <encoding value="utf-8"/>
         <preserveLogFileNameExtension value="true" />
         <appendToFile value="true" />
-        <rollingStyle value="Date" />
+        <rollingStyle value="Composite" />
+		<maxSizeRollBackups value="100"/>
+		<maximumFileSize value="256MB"/>
         <datePattern value="yyyyMMdd" />
         <layout type="log4net.Layout.PatternLayout">
             <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
         </layout>
     </appender>
       <appender name="warnAppender" type="log4net.Appender.RollingFileAppender">
-            <filter type="log4net.Filter.LevelMatchFilter">
-                <levelToMatch value="WARN" />
-            </filter>
-            <filter type="log4net.Filter.DenyAllFilter" />
-            <file value="warn" />
-            <encoding value="utf-8"/>
-            <preserveLogFileNameExtension value="true" />
-            <appendToFile value="true" />
-            <rollingStyle value="Date" />
-            <datePattern value="yyyyMMdd" />
-            <layout type="log4net.Layout.PatternLayout">
-                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
-            </layout>
-        </appender>
-    <appender name="infoAppender" type="log4net.Appender.RollingFileAppender">
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
         <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="INFO" />
+            <levelToMatch value="WARN" />
         </filter>
         <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="info" />
+        <file value="warn" />
         <encoding value="utf-8"/>
         <preserveLogFileNameExtension value="true" />
         <appendToFile value="true" />
-        <rollingStyle value="Date" />
+		<rollingStyle value="Composite" />
+		<maxSizeRollBackups value="100"/>
+		<maximumFileSize value="256MB"/>
         <datePattern value="yyyyMMdd" />
         <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
+                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
         </layout>
     </appender>
-    <appender name="debugAppender" type="log4net.Appender.RollingFileAppender">
+    <appender name="infoAppender" type="log4net.Appender.RollingFileAppender">
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
         <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="DEBUG" />
+            <levelToMatch value="INFO" />
         </filter>
         <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="debug" />
+        <file value="info" />
         <encoding value="utf-8"/>
         <preserveLogFileNameExtension value="true" />
         <appendToFile value="true" />
-        <rollingStyle value="Date" />
+        <rollingStyle value="Composite" />
+		<maxSizeRollBackups value="100"/>
+		<maximumFileSize value="256MB"/>
         <datePattern value="yyyyMMdd" />
         <layout type="log4net.Layout.PatternLayout">
             <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
         </layout>
     </appender>
-    <appender name="perfAppender" type="log4net.Appender.RollingFileAppender">
+    <appender name="debugAppender" type="log4net.Appender.RollingFileAppender">
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
         <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="INFO" />
+            <levelToMatch value="DEBUG" />
         </filter>
         <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="perf" />
+        <file value="debug" />
         <encoding value="utf-8"/>
         <preserveLogFileNameExtension value="true" />
         <appendToFile value="true" />
-        <rollingStyle value="Date" />
+        <rollingStyle value="Composite" />
+		<maxSizeRollBackups value="100"/>
+		<maximumFileSize value="256MB"/>
         <datePattern value="yyyyMMdd" />
         <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date %logger - %message%newline" />
+            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
         </layout>
-    </appender>
-  
+    </appender>  
     <root>
         <level value="ALL" />
         <appender-ref ref="errorAppender" />
         <appender-ref ref="warnAppender" />
         <appender-ref ref="infoAppender" />
-    </root>
-  
-    <logger name="Performance" additivity="true">
-      <level value="ALL" />
-      <appender-ref ref="perfAppender" />
-    </logger>
-  
+		<appender-ref ref="debugAppender" />
+    </root>  
 </log4net>

BIN
Library/Debug/Newtonsoft.Json.dll


BIN
Library/Debug/SuperSocket.SocketEngine.dll


+ 285 - 254
Library/Debug/SuperSocket.SocketEngine.xml

@@ -381,7 +381,272 @@
             Command assembly configuation collection
             </summary>
         </member>
+        <member name="T:SuperSocket.SocketEngine.Configuration.Server">
+            <summary>
+            Server, the port which is compatible with .Net 4.5 or higher
+            </summary>
+            <summary>
+            Server configuration
+            </summary>
+        </member>
+        <member name="M:SuperSocket.SocketEngine.Configuration.Server.GetChildConfig``1(System.String)">
+            <summary>
+            Gets the child config.
+            </summary>
+            <typeparam name="TConfig">The type of the config.</typeparam>
+            <param name="childConfigName">Name of the child config.</param>
+            <returns></returns>
+        </member>
+        <member name="M:SuperSocket.SocketEngine.Configuration.Server.OnDeserializeUnrecognizedAttribute(System.String,System.String)">
+            <summary>
+            Gets a value indicating whether an unknown attribute is encountered during deserialization.
+            To keep compatible with old configuration
+            </summary>
+            <param name="name">The name of the unrecognized attribute.</param>
+            <param name="value">The value of the unrecognized attribute.</param>
+            <returns>
+            true when an unknown attribute is encountered while deserializing; otherwise, false.
+            </returns>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.DefaultCulture">
+            <summary>
+            Gets/sets the default culture for this server.
+            </summary>
+            <value>
+            The default culture.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerTypeName">
+            <summary>
+            Gets the name of the server type this appServer want to use.
+            </summary>
+            <value>
+            The name of the server type.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerType">
+            <summary>
+            Gets the type definition of the appserver.
+            </summary>
+            <value>
+            The type of the server.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveFilterFactory">
+            <summary>
+            Gets the Receive filter factory.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Ip">
+            <summary>
+            Gets the ip.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Port">
+            <summary>
+            Gets the port.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Mode">
+            <summary>
+            Gets the mode.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Disabled">
+            <summary>
+            Gets a value indicating whether this <see cref="T:SuperSocket.SocketBase.Config.IServerConfig"/> is disabled.
+            </summary>
+            <value>
+              <c>true</c> if disabled; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendTimeOut">
+            <summary>
+            Gets the send time out.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxConnectionNumber">
+            <summary>
+            Gets the max connection number.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveBufferSize">
+            <summary>
+            Gets the size of the receive buffer.
+            </summary>
+            <value>
+            The size of the receive buffer.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendBufferSize">
+            <summary>
+            Gets the size of the send buffer.
+            </summary>
+            <value>
+            The size of the send buffer.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SyncSend">
+            <summary>
+            Gets a value indicating whether sending is in synchronous mode.
+            </summary>
+            <value>
+              <c>true</c> if [sync send]; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogCommand">
+            <summary>
+            Gets a value indicating whether log command in log file.
+            </summary>
+            <value><c>true</c> if log command; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogBasicSessionActivity">
+            <summary>
+            Gets a value indicating whether [log basic session activity like connected and disconnected].
+            </summary>
+            <value>
+            	<c>true</c> if [log basic session activity]; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogAllSocketException">
+            <summary>
+            Gets a value indicating whether [log all socket exception].
+            </summary>
+            <value>
+            <c>true</c> if [log all socket exception]; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSession">
+            <summary>
+            Gets a value indicating whether clear idle session.
+            </summary>
+            <value><c>true</c> if clear idle session; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSessionInterval">
+            <summary>
+            Gets the clear idle session interval, in seconds.
+            </summary>
+            <value>The clear idle session interval.</value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.IdleSessionTimeOut">
+            <summary>
+            Gets the idle session timeout time length, in seconds.
+            </summary>
+            <value>The idle session time out.</value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CertificateConfig">
+            <summary>
+            Gets the certificate config.
+            </summary>
+            <value>The certificate config.</value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Certificate">
+            <summary>
+            Gets X509Certificate configuration.
+            </summary>
+            <value>
+            X509Certificate configuration.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Security">
+            <summary>
+            Gets the security protocol, X509 certificate.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxRequestLength">
+            <summary>
+            Gets the max allowed length of request.
+            </summary>
+            <value>
+            The max allowed length of request.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.DisableSessionSnapshot">
+            <summary>
+            Gets a value indicating whether [disable session snapshot]
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SessionSnapshotInterval">
+            <summary>
+            Gets the interval to taking snapshot for all live sessions.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ConnectionFilter">
+            <summary>
+            Gets the connection filters used by this server instance.
+            </summary>
+            <value>
+            The connection filters's name list, seperated by comma
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandLoader">
+            <summary>
+            Gets the command loader, multiple values should be separated by comma.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveTime">
+            <summary>
+            Gets the start keep alive time, in seconds
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveInterval">
+            <summary>
+            Gets the keep alive interval, in seconds.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ListenBacklog">
+            <summary>
+            Gets the backlog size of socket listening.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.StartupOrder">
+            <summary>
+            Gets the startup order of the server instance.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendingQueueSize">
+            <summary>
+            Gets/sets the size of the sending queue.
+            </summary>
+            <value>
+            The size of the sending queue.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogFactory">
+            <summary>
+            Gets the logfactory name of the server instance.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.TextEncoding">
+            <summary>
+            Gets the default text encoding.
+            </summary>
+            <value>
+            The text encoding.
+            </value>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Listeners">
+            <summary>
+            Gets the listeners' configuration.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SuperSocket#SocketBase#Config#IServerConfig#Listeners">
+            <summary>
+            Gets the listeners' configuration.
+            </summary>
+        </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandAssemblies">
+            <summary>
+            Gets the command assemblies configuration.
+            </summary>
+            <value>
+            The command assemblies.
+            </value>
+        </member>
         <member name="T:SuperSocket.SocketEngine.Configuration.SocketServiceConfig">
+            <summary>
+            SocketServiceConfig, the part which is compatible with .Net 4.5 or higher
+            </summary>
             <summary>
             SuperSocket's root configuration node
             </summary>
@@ -416,6 +681,14 @@
             <param name="childConfigName">Name of the child config.</param>
             <returns></returns>
         </member>
+        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.DefaultCulture">
+            <summary>
+            Gets/sets the default culture for all server instances.
+            </summary>
+            <value>
+            The default culture.
+            </value>
+        </member>
         <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.Servers">
             <summary>
             Gets all the server configurations
@@ -575,24 +848,33 @@
             Socket Session, all application session should base on this class
             </summary>
         </member>
-        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Exception)">
+        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Exception,System.String,System.String,System.Int32)">
             <summary>
             Logs the error, skip the ignored exception
             </summary>
             <param name="exception">The exception.</param>
+            <param name="caller">The caller.</param>
+            <param name="callerFilePath">The caller file path.</param>
+            <param name="callerLineNumber">The caller line number.</param>
         </member>
-        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.String,System.Exception)">
+        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.String,System.Exception,System.String,System.String,System.Int32)">
             <summary>
             Logs the error, skip the ignored exception
             </summary>
             <param name="message">The message.</param>
             <param name="exception">The exception.</param>
+            <param name="caller">The caller.</param>
+            <param name="callerFilePath">The caller file path.</param>
+            <param name="callerLineNumber">The caller line number.</param>
         </member>
-        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Int32)">
+        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Int32,System.String,System.String,System.Int32)">
             <summary>
             Logs the socket error, skip the ignored error
             </summary>
             <param name="socketErrorCode">The socket error code.</param>
+            <param name="caller">The caller.</param>
+            <param name="callerFilePath">The caller file path.</param>
+            <param name="callerLineNumber">The caller line number.</param>
         </member>
         <member name="M:SuperSocket.SocketEngine.SocketSession.Start">
             <summary>
@@ -945,257 +1227,6 @@
             Listener configuration collection
             </summary>
         </member>
-        <member name="T:SuperSocket.SocketEngine.Configuration.Server">
-            <summary>
-            Server configuration
-            </summary>
-        </member>
-        <member name="M:SuperSocket.SocketEngine.Configuration.Server.GetChildConfig``1(System.String)">
-            <summary>
-            Gets the child config.
-            </summary>
-            <typeparam name="TConfig">The type of the config.</typeparam>
-            <param name="childConfigName">Name of the child config.</param>
-            <returns></returns>
-        </member>
-        <member name="M:SuperSocket.SocketEngine.Configuration.Server.OnDeserializeUnrecognizedAttribute(System.String,System.String)">
-            <summary>
-            Gets a value indicating whether an unknown attribute is encountered during deserialization.
-            To keep compatible with old configuration
-            </summary>
-            <param name="name">The name of the unrecognized attribute.</param>
-            <param name="value">The value of the unrecognized attribute.</param>
-            <returns>
-            true when an unknown attribute is encountered while deserializing; otherwise, false.
-            </returns>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerTypeName">
-            <summary>
-            Gets the name of the server type this appServer want to use.
-            </summary>
-            <value>
-            The name of the server type.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerType">
-            <summary>
-            Gets the type definition of the appserver.
-            </summary>
-            <value>
-            The type of the server.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveFilterFactory">
-            <summary>
-            Gets the Receive filter factory.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Ip">
-            <summary>
-            Gets the ip.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Port">
-            <summary>
-            Gets the port.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Mode">
-            <summary>
-            Gets the mode.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Disabled">
-            <summary>
-            Gets a value indicating whether this <see cref="T:SuperSocket.SocketBase.Config.IServerConfig"/> is disabled.
-            </summary>
-            <value>
-              <c>true</c> if disabled; otherwise, <c>false</c>.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendTimeOut">
-            <summary>
-            Gets the send time out.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxConnectionNumber">
-            <summary>
-            Gets the max connection number.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveBufferSize">
-            <summary>
-            Gets the size of the receive buffer.
-            </summary>
-            <value>
-            The size of the receive buffer.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendBufferSize">
-            <summary>
-            Gets the size of the send buffer.
-            </summary>
-            <value>
-            The size of the send buffer.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SyncSend">
-            <summary>
-            Gets a value indicating whether sending is in synchronous mode.
-            </summary>
-            <value>
-              <c>true</c> if [sync send]; otherwise, <c>false</c>.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogCommand">
-            <summary>
-            Gets a value indicating whether log command in log file.
-            </summary>
-            <value><c>true</c> if log command; otherwise, <c>false</c>.</value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogBasicSessionActivity">
-            <summary>
-            Gets a value indicating whether [log basic session activity like connected and disconnected].
-            </summary>
-            <value>
-            	<c>true</c> if [log basic session activity]; otherwise, <c>false</c>.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogAllSocketException">
-            <summary>
-            Gets a value indicating whether [log all socket exception].
-            </summary>
-            <value>
-            <c>true</c> if [log all socket exception]; otherwise, <c>false</c>.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSession">
-            <summary>
-            Gets a value indicating whether clear idle session.
-            </summary>
-            <value><c>true</c> if clear idle session; otherwise, <c>false</c>.</value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSessionInterval">
-            <summary>
-            Gets the clear idle session interval, in seconds.
-            </summary>
-            <value>The clear idle session interval.</value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.IdleSessionTimeOut">
-            <summary>
-            Gets the idle session timeout time length, in seconds.
-            </summary>
-            <value>The idle session time out.</value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CertificateConfig">
-            <summary>
-            Gets the certificate config.
-            </summary>
-            <value>The certificate config.</value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Certificate">
-            <summary>
-            Gets X509Certificate configuration.
-            </summary>
-            <value>
-            X509Certificate configuration.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Security">
-            <summary>
-            Gets the security protocol, X509 certificate.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxRequestLength">
-            <summary>
-            Gets the max allowed length of request.
-            </summary>
-            <value>
-            The max allowed length of request.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.DisableSessionSnapshot">
-            <summary>
-            Gets a value indicating whether [disable session snapshot]
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SessionSnapshotInterval">
-            <summary>
-            Gets the interval to taking snapshot for all live sessions.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ConnectionFilter">
-            <summary>
-            Gets the connection filters used by this server instance.
-            </summary>
-            <value>
-            The connection filters's name list, seperated by comma
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandLoader">
-            <summary>
-            Gets the command loader, multiple values should be separated by comma.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveTime">
-            <summary>
-            Gets the start keep alive time, in seconds
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveInterval">
-            <summary>
-            Gets the keep alive interval, in seconds.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ListenBacklog">
-            <summary>
-            Gets the backlog size of socket listening.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.StartupOrder">
-            <summary>
-            Gets the startup order of the server instance.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendingQueueSize">
-            <summary>
-            Gets/sets the size of the sending queue.
-            </summary>
-            <value>
-            The size of the sending queue.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogFactory">
-            <summary>
-            Gets the logfactory name of the server instance.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.TextEncoding">
-            <summary>
-            Gets the default text encoding.
-            </summary>
-            <value>
-            The text encoding.
-            </value>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Listeners">
-            <summary>
-            Gets the listeners' configuration.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SuperSocket#SocketBase#Config#IServerConfig#Listeners">
-            <summary>
-            Gets the listeners' configuration.
-            </summary>
-        </member>
-        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandAssemblies">
-            <summary>
-            Gets the command assemblies configuration.
-            </summary>
-            <value>
-            The command assemblies.
-            </value>
-        </member>
         <member name="T:SuperSocket.SocketEngine.Configuration.ServerCollection">
             <summary>
             Server configuration collection

+ 6 - 2
XmdsCommon/XmdsCommon.csproj

@@ -19,7 +19,7 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <OutputPath>..\Library\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;JSGProfile</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <DocumentationFile>
@@ -31,7 +31,7 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>..\Library\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;JSGProfile</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <Prefer32Bit>false</Prefer32Bit>
@@ -47,6 +47,10 @@
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Common\Library\SuperSocket(1.6.6).Binaries\Net45\Release\Newtonsoft.Json.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />

+ 3 - 3
XmdsCommonServer/Plugin/Units/XmdsInstancePlayer.cs

@@ -894,7 +894,7 @@ namespace XmdsCommonServer.Plugin.Units
 			cleanFocus();
 			lastAttackUnit = null;
 
-			XmdsVirtual.FormatLog(CommonLang.Log.LoggerLevel.DEBUG, "act.reason:" + act.reason);
+			//XmdsVirtual.FormatLog(CommonLang.Log.LoggerLevel.DEBUG, "act.reason:" + act.reason);
 			if (act.guard == false)
 			{
 				//  mAutoGuardTargetList.Clear();
@@ -973,7 +973,7 @@ namespace XmdsCommonServer.Plugin.Units
 								if (targetId > 0)
 								{
 									mAutoGuardTargetList.Add(targetId);
-									log.Debug("--------------addTarget id: " + targetId);
+									//log.Debug("--------------addTarget id: " + targetId);
 								}
 							}
 						}
@@ -1844,7 +1844,7 @@ namespace XmdsCommonServer.Plugin.Units
 		{
 			if (IsGuard)
 			{
-				log.Debug("------guardCanceled: " + this.Name);
+				//log.Debug("------guardCanceled: " + this.Name);
 				UnitGuardAction action = new UnitGuardAction();
 				action.guard = false;
 				action.reason = "sdfsdfsdfs";

+ 2 - 2
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.Event.cs

@@ -1261,7 +1261,7 @@ namespace XmdsCommonServer.Plugin
 			if(prop.SkillTemplateID == XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills.XmdsBattleSkill.DefaultSkillScriptID)
 			{
 				XmdsBattleSkill.mDefDamgageHandler.m_cal.Invoke(this, hitter, source, XmdsBattleSkill.mDefDamgageHandler.m_skill, ref result, ref damage);
-				FormatLog(CommonLang.Log.LoggerLevel.INFO, "--【{0}】对目标【{1}】使用技能【{2}】效果 = 【{3}】", this.mInfo.Name, hitter.mInfo.Name, prop.SkillTemplateID, damage);
+				//FormatLog(CommonLang.Log.LoggerLevel.INFO, "--【{0}】对目标【{1}】使用技能【{2}】效果 = 【{3}】", this.mInfo.Name, hitter.mInfo.Name, prop.SkillTemplateID, damage);
 			}
             else if (prop.SkillTemplateID > 0)
             {
@@ -1274,7 +1274,7 @@ namespace XmdsCommonServer.Plugin
                     {
 						isFind = true;
 						bool isEnd = hand.m_cal.Invoke(this, hitter, source, hand.m_skill, ref result, ref damage);
-                        FormatLog(CommonLang.Log.LoggerLevel.INFO, "【{0}】对目标【{1}】使用技能【{2}】效果 = 【{3}】", this.mInfo.Name, hitter.mInfo.Name, prop.SkillTemplateID, damage);
+                        //FormatLog(CommonLang.Log.LoggerLevel.INFO, "【{0}】对目标【{1}】使用技能【{2}】效果 = 【{3}】", this.mInfo.Name, hitter.mInfo.Name, prop.SkillTemplateID, damage);
 						if (isEnd) { break; }
                     }
                 }

+ 1 - 1
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.Skills.cs

@@ -1127,7 +1127,7 @@ namespace XmdsCommonServer.Plugin
 					//如果UnitSkill为NULL,则读取默认脚本.
 					if (us == null)
 					{
-						FormatLog(CommonLang.Log.LoggerLevel.INFO, string.Format("单位{0}主动技能{1}未找到脚本,使用默认脚本代替", mOwner.mInfo.TemplateID, gs.SkillID));
+						//FormatLog(CommonLang.Log.LoggerLevel.INFO, string.Format("单位{0}主动技能{1}未找到脚本,使用默认脚本代替", mOwner.mInfo.TemplateID, gs.SkillID));
 						us = XmdsBattleSkill.GetUnitSkill(XmdsBattleSkill.DefaultSkillScriptID);
 
 						// 宠物或者人物如果没有配置对应的技能文件,就设置为不自动释放技能

+ 32 - 4
XmdsCommonServer/Plugin/XmdsVirtual/XmdsVirtual.cs

@@ -22,6 +22,7 @@ using static CommonAI.Zone.Instance.InstanceUnit;
 using CommonAI.data;
 using XmdsCommonServer.Plugin.Base;
 using XmdsCommonSkill.Plugin.CardSkill;
+using CommonAI.ZoneServer.JSGModule;
 
 namespace XmdsCommonServer.Plugin
 {
@@ -40,8 +41,8 @@ namespace XmdsCommonServer.Plugin
         public static Logger log = LoggerFactory.GetDefLogger();
         public static void FormatLog(string txt, params object[] args)
         {
-            if (args != null) { log.Debug(string.Format(txt, args)); }
-            else { log.Debug(txt); }
+            //if (args != null) { log.Debug(string.Format(txt, args)); }
+            //else { log.Debug(txt); }
         }
 
         public static void FormatLog(uint level, string txt, params object[] args)
@@ -56,8 +57,11 @@ namespace XmdsCommonServer.Plugin
                     case LoggerLevel.WARNNING:
                         log.Warn(string.Format(txt, args));
                         break;
+                    case LoggerLevel.INFO:
+                        log.Info(string.Format(txt, args));
+                        break;
                     default:
-                        log.Debug(string.Format(txt, args));
+                        //log.Debug(string.Format(txt, args));
                         break;
                 }
             }
@@ -71,8 +75,11 @@ namespace XmdsCommonServer.Plugin
                     case LoggerLevel.WARNNING:
                         log.Warn(txt);
                         break;
+                    case LoggerLevel.INFO:
+                        log.Info(txt);
+                        break;
                     default:
-                        log.Debug(txt);
+                        //log.Debug(txt);
                         break;
                 }
             }
@@ -99,6 +106,7 @@ namespace XmdsCommonServer.Plugin
         //是否完成初始化技能.
         protected bool mFinishSkillInit = false;
         public XmdsUnitProp MirrorProp;
+        private UnitSimpleProp mSimpleProp;
         //脱战计时器.
         private TimeExpire<int> mOutOfCombatTime = null;
         //血量回复计时器.
@@ -984,6 +992,26 @@ namespace XmdsCommonServer.Plugin
         }
 
 
+        public UnitSimpleProp GetSimpleProp()
+        {
+            if(mSimpleProp == null)
+            {
+                mSimpleProp = new UnitSimpleProp();
+            }
+
+            if(this.MirrorProp != null)
+            {
+                mSimpleProp.mCurHp = this.mUnit.CurrentHP;
+                mSimpleProp.mMaxHP = this.MirrorProp.MaxHP;
+                mSimpleProp.mAtk = this.MirrorProp.MaxAttack;
+                mSimpleProp.mDef = this.MirrorProp.Defence;
+                mSimpleProp.mMonsterAtk = this.MirrorProp.MaxMonsterAttack;
+                mSimpleProp.mMonsterDef = this.MirrorProp.MaxMonsterDef;
+            }
+           
+            return mSimpleProp;
+        }
+
         #endregion
 
         #region 战斗状态.

+ 2 - 2
XmdsServerCS/XmdsServerEdgeJS/Zone/ZoneService.cs

@@ -136,7 +136,7 @@ namespace XmdsServerEdgeJS.Zone
 			eventStat.Player = PlayerCount;
 			eventStat.Memory_MB = ProcessPrivateMemoryMB;
 			eventStat.Pool = ObjectPoolStatus.TotalActive + "/" + ObjectPoolStatus.TotalCount;
-			monitorLog.Info(eventStat);
+			monitorLog.Debug(eventStat);
 
 			// 输出统计日志
 			if (JSGServerProfile.CheckPrintAllData())
@@ -184,7 +184,7 @@ namespace XmdsServerEdgeJS.Zone
 					codec = new BattleCodec(ZoneNodeManager.Templates.Templates);
 
 					//日志定时器
-					logUpdateTimer = new Timer(updateLog, this, 30000, 30000);
+					logUpdateTimer = new Timer(updateLog, this, 60000, 60000);
 				}
 				catch (Exception err)
 				{

+ 1 - 1
XmdsServerCS/XmdsServerEdgeJS/Zone/ZoneServiceICE.cs

@@ -1251,7 +1251,7 @@ namespace XmdsServerEdgeJS.Zone
 						XmdsVirtual_Pet petData = zv.GetPet();
 						if (petData == null)
 						{
-							log.Error("找不到玩家对应宠物信息:" + playerId);
+							log.Warn("找不到玩家对应宠物信息:" + playerId);
 							break; ;
 						}
 

+ 1 - 1
test/app.config

@@ -6,7 +6,7 @@
     <add key="logConfig.serverId" value="csharp-server-11" />
     <add key="logConfig.outputPath" value="../log/" />
     <!-- DEBUG、INFO、WARNNING、ERROR-->
-    <add key="logConfig.level" value="INFO" />
+    <add key="logConfig.level" value="DEBUG" />
     <!--add key="iceConfig.host" value="192.168.92.2" /-->
     <add key="iceConfig.port" value="3910" />
     <add key="iceConfig.isTraceNetwork" value="true" />

+ 0 - 91
test/config/log4net

@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<log4net>
-    <appender name="errorAppender" type="log4net.Appender.RollingFileAppender">
-        <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="ERROR" />
-        </filter>
-        <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="err" />
-        <encoding value="utf-8"/>
-        <preserveLogFileNameExtension value="true" />
-        <appendToFile value="true" />
-        <rollingStyle value="Date" />
-        <datePattern value="yyyyMMdd" />
-        <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
-        </layout>
-    </appender>
-      <appender name="warnAppender" type="log4net.Appender.RollingFileAppender">
-            <filter type="log4net.Filter.LevelMatchFilter">
-                <levelToMatch value="WARN" />
-            </filter>
-            <filter type="log4net.Filter.DenyAllFilter" />
-            <file value="warn" />
-            <encoding value="utf-8"/>
-            <preserveLogFileNameExtension value="true" />
-            <appendToFile value="true" />
-            <rollingStyle value="Date" />
-            <datePattern value="yyyyMMdd" />
-            <layout type="log4net.Layout.PatternLayout">
-                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
-            </layout>
-        </appender>
-    <appender name="infoAppender" type="log4net.Appender.RollingFileAppender">
-        <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="INFO" />
-        </filter>
-        <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="info" />
-        <encoding value="utf-8"/>
-        <preserveLogFileNameExtension value="true" />
-        <appendToFile value="true" />
-        <rollingStyle value="Date" />
-        <datePattern value="yyyyMMdd" />
-        <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
-        </layout>
-    </appender>
-    <appender name="debugAppender" type="log4net.Appender.RollingFileAppender">
-        <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="DEBUG" />
-        </filter>
-        <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="debug" />
-        <encoding value="utf-8"/>
-        <preserveLogFileNameExtension value="true" />
-        <appendToFile value="true" />
-        <rollingStyle value="Date" />
-        <datePattern value="yyyyMMdd" />
-        <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
-        </layout>
-    </appender>
-    <appender name="perfAppender" type="log4net.Appender.RollingFileAppender">
-        <filter type="log4net.Filter.LevelMatchFilter">
-            <levelToMatch value="INFO" />
-        </filter>
-        <filter type="log4net.Filter.DenyAllFilter" />
-        <file value="perf" />
-        <encoding value="utf-8"/>
-        <preserveLogFileNameExtension value="true" />
-        <appendToFile value="true" />
-        <rollingStyle value="Date" />
-        <datePattern value="yyyyMMdd" />
-        <layout type="log4net.Layout.PatternLayout">
-            <conversionPattern value="%date %logger - %message%newline" />
-        </layout>
-    </appender>
-  
-    <root>
-        <level value="ALL" />
-        <appender-ref ref="errorAppender" />
-        <appender-ref ref="warnAppender" />
-        <appender-ref ref="infoAppender" />
-    </root>
-  
-    <logger name="Performance" additivity="true">
-      <level value="ALL" />
-      <appender-ref ref="perfAppender" />
-    </logger>
-  
-</log4net>