Explorar o código

使用装饰模式将Log库打印文件名行号功能剥离出来,以后新增第三方log只需要继承ILogger接口,然后装配上不同的装饰器就可以提供不同的打印信息

tanghai %!s(int64=13) %!d(string=hai) anos
pai
achega
a6f56844a2

+ 27 - 0
CSharp/Platform/Log/ALogDecorater.cs

@@ -0,0 +1,27 @@
+
+namespace Log
+{
+	public abstract class ALogDecorater
+	{
+		private int level;
+
+		protected ALogDecorater decorater;
+
+		public int Level
+		{
+			get
+			{
+				return this.level;
+			}
+			set
+			{
+				if (decorater != null)
+				{
+					decorater.Level = value + 1;
+				}
+				this.level = value;
+			}
+		}
+		public abstract string Decorate(string message);
+	}
+}

+ 1 - 12
CSharp/Platform/Log/ILogger.cs

@@ -2,18 +2,7 @@
 namespace Log
 {
     public interface ILogger
-    {
-		bool FileName
-		{
-			get;
-			set;
-		}
-
-		bool FileLineNumber
-		{
-			get;
-			set;
-		}
+	{
 		void Trace(string message);
 	    void Debug(string message);
     }

+ 4 - 2
CSharp/Platform/Log/Log.csproj

@@ -7,8 +7,8 @@
     <ProjectGuid>{72E16572-FC1F-4A9E-BC96-035417239298}</ProjectGuid>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ELog</RootNamespace>
-    <AssemblyName>ELog</AssemblyName>
+    <RootNamespace>Log</RootNamespace>
+    <AssemblyName>Log</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
@@ -44,9 +44,11 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ALogDecorater.cs" />
     <Compile Include="Logger.cs" />
     <Compile Include="ILogger.cs" />
     <Compile Include="NLoggerAdapter.cs" />
+    <Compile Include="StackInfoDecorater.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="Packages.config" />

+ 1 - 1
CSharp/Platform/Log/Logger.cs

@@ -3,7 +3,7 @@ namespace Log
 {
 	public static class Logger
 	{
-		private static readonly ILogger globalLogger = new NLoggerAdapter();
+		private static readonly ILogger globalLogger = new NLoggerAdapter(new StackInfoDecorater());
 
 		public static ILogger GlobalLogger
 		{

+ 16 - 42
CSharp/Platform/Log/NLoggerAdapter.cs

@@ -1,67 +1,41 @@
-using System.Diagnostics;
-using System.IO;
-using NLog;
+using NLog;
 
 namespace Log
 {
-	public class NLoggerAdapter: ILogger
+	public class NLoggerAdapter : ILogger
 	{
 		private const string SEP = " ";
 
-		private readonly NLog.Logger logger = LogManager.GetCurrentClassLogger();
-
-		public NLoggerAdapter()
-		{
-			this.FileName = true;
-			this.FileLineNumber = true;
-		}
+		private readonly ALogDecorater decorater;
 
-		public bool FileName
-		{
-			get;
-			set;
-		}
-
-		public bool FileLineNumber
-		{
-			get;
-			set;
-		}
+		private readonly NLog.Logger logger = LogManager.GetCurrentClassLogger();
 
-		public string GetExtraInfo()
+		public NLoggerAdapter(ALogDecorater decorater = null)
 		{
-			if (!this.FileLineNumber && !this.FileName)
+			this.decorater = decorater;
+			if (this.decorater != null)
 			{
-				return SEP;
+				this.decorater.Level = 0;
 			}
+		}
 
-			string extraInfo = "";
-			var stackTrace = new StackTrace(true);
-			var frame = stackTrace.GetFrame(3);
-
-			if (FileName)
-			{
-				var fileName = Path.GetFileName(frame.GetFileName());
-				extraInfo += fileName + " ";
-			}
-			if (FileLineNumber)
+		public string Decorate(string message)
+		{
+			if (decorater == null)
 			{
-				var fileLineNumber = frame.GetFileLineNumber();
-				extraInfo += fileLineNumber + " ";
+				return message;
 			}
-			extraInfo += SEP;
-
-			return extraInfo;
+			return decorater.Decorate(message);
 		}
 
 		public void Trace(string message)
 		{
-			logger.Trace(GetExtraInfo() + message);
+			logger.Trace(Decorate(SEP + message));
 		}
 
 		public void Debug(string message)
 		{
-			logger.Debug(GetExtraInfo() + message);
+			logger.Debug(Decorate(SEP + message));
 		}
 	}
 }

+ 57 - 0
CSharp/Platform/Log/StackInfoDecorater.cs

@@ -0,0 +1,57 @@
+using System.Diagnostics;
+using System.IO;
+
+namespace Log
+{
+	class StackInfoDecorater: ALogDecorater
+	{
+
+		public StackInfoDecorater(ALogDecorater decorater = null)
+		{
+			this.decorater = decorater;
+			this.FileName = true;
+			this.FileLineNumber = true;
+		}
+
+		public bool FileName
+		{
+			get;
+			set;
+		}
+
+		public bool FileLineNumber
+		{
+			get;
+			set;
+		}
+
+		public override string Decorate(string message)
+		{
+			if (decorater != null)
+			{
+				message = decorater.Decorate(message);
+			}
+
+			if (!this.FileLineNumber && !this.FileName)
+			{
+				return message;
+			}
+
+			string extraInfo = "";
+			var stackTrace = new StackTrace(true);
+			var frame = stackTrace.GetFrame(this.Level + 4);
+
+			if (FileName)
+			{
+				var fileName = Path.GetFileName(frame.GetFileName());
+				extraInfo += fileName + " ";
+			}
+			if (FileLineNumber)
+			{
+				var fileLineNumber = frame.GetFileLineNumber();
+				extraInfo += fileLineNumber + " ";
+			}
+			return extraInfo + message;
+		}
+	}
+}