環境:app
VS 2012ide
PostSharp-4.1.28 (下載地址)https://visualstudiogallery.msdn.microsoft.com/a058d5d3-e654-43f8-a308-c3bdfdd0be4a/file/89212/69/PostSharp-4.1.28.exe工具
log4net 2.0.3post
首先搭建環境:測試
下載好PostSharp 以後進行安裝。以後建立項目ui
一、引用PoastSharpthis
PoastSharp引用方式以下:spa
VS工具 —>> NuGet 程序包管理 —>> 管理解決方案的NuGet程序包 出現以下圖:日誌
搜索PostSharp 安裝等待...code
安裝完成以後會在項目的解決方案同級目錄下出現下列文件:
同時解決方案裏面的項目會自動出現PostSharp的引用、
若是沒有自動引用,咱們就手動引用下就行了。 根據.NET Framework的版本,選擇對應的dll
PostSharp.dll 安裝引用已經OK了。
二、log4net安裝引用
打開 VS工具 —>> NuGet 程序包管理 —>> 程序包管理器控制檯
在控制檯中輸入 PM> Install-Package log4net (PM> 是已經有了的)敲回車鍵
而後安心等待...(上面的紅色的Error是由於網速比較慢,沒有Load出來, 沒有關係再來一次)
下面第二次能夠看見已經安裝成功,而且把個人機器上老版本替換掉了。 幹得漂亮!!!
如PostSharp 同樣,也會在解決方案下面出現lib文件, 若是項目裏面沒有引用的就手動引用好了。
接下來開始真正的幹活了......
首先配置好log4net.config
下面是我習慣的步驟:
一、在應用程序下建立 App.config 文件
二、修改App.config 文件的內容(直接複製替換好了,詳細的配置項就不說明了)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!-- You can add your own appender here. --> <!-- Define some output appenders --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- This appender is used for writing application log. --> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!-- Log file name, you can find the file in the application startup directory. --> <param name="File" type="log4net.Util.PatternString" value="Log\Client_%date{yyyyMMddHHmmss}.log"/> <param name="Encoding" value="UTF-8"/> <param name="AppendToFile" value="true"/> <param name="MaxSizeRollBackups" value="10"/> <!-- The maximum size of the log file, when the log file size exceed this size, a new log.txt will created and the old one will rename to log.txt.1. --> <param name="MaximumFileSize" value="2MB"/> <param name="RollingStyle" value="Size"/> <param name="StaticLogFileName" value="true"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%date [%thread] %logger %-5level - %message%newline"/> </layout> </appender> <!-- The root logger. Set the level to log the necessary log information only. The level can be set to: ALL, DEBUG, INFO, WARN, ERROR, Fatal The appender-ref can be set the any appender name in this configuration file. --> <root> <level value="ALL"/> <appender-ref ref="RollingFileAppender"/> <appender-ref ref="ConsoleAppender"/> </root> </log4net> </configuration>
三、接着很重要的一步,否則配置的都白乾了...
打開AssemblyInfo.cs文件,在文件最後添加一行代碼
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
好的,到此。log4net 已經配置完成。 能夠先測試一下log4net 是否能夠正常工做
建立一個空的WinForm,添加以下代碼
using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; using log4net; namespace PostSharp.Demo { public partial class TestLog4netFrm : Form { public static log4net.ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public TestLog4netFrm() { InitializeComponent(); } private void TestLog4netFrm_Load(object sender, EventArgs e) { _logger.Debug("test log4net "); } } }
而後生成運行。
運行成功以後,關掉Form。 打開bin/Debug 能夠看見有一個Log文件夾裏面會生成一個日誌文件,打開能夠看見咱們剛纔寫的 test log4net
好的。 幹得漂亮!!! 已經成功一半了。即便不用postSharp也能夠完成平常的打Log了。
爲了繼續完善,把PostSharp使用起來,讓它給咱們自動的打Log。
一、建立項目 PostSharp.Core ,建立文件TraceAttribute.cs
TraceAttribute.cs 代碼以下:(格式能夠根據須要本身調整的...)
using System; using System.Collections.Generic; using System.Text; using PostSharp.Aspects; using PostSharp.Extensibility; using System.Reflection; namespace PostSharp.Core { [Serializable] public sealed class TraceAttribute : OnMethodBoundaryAspect { // Create a logger for use in this class, called only once private static readonly log4net.ILog _logger; private string _methodName; // These fields are initialized at runtime. They do not need to be serialized. [NonSerialized] private int _hashCode; static TraceAttribute() { if (!PostSharpEnvironment.IsPostSharpRunning) { _logger = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } } // Default constructor, invoked at build time. public TraceAttribute() { // Do nothing } // Invoked only once at runtime from the static constructor of type declaring the target method. public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { _methodName = method.DeclaringType.Name + "." + method.Name; } // Invoked only once at runtime from the static constructor of type declaring the target method. public override void RuntimeInitialize(MethodBase method) { _hashCode = this.GetHashCode(); } // Invoked at runtime before that target method is invoked. public override void OnEntry(MethodExecutionArgs args) { _logger.DebugFormat(">>> Entry [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime after the target method is invoked (in a finally block). public override void OnExit(MethodExecutionArgs args) { _logger.DebugFormat("<<< Exit [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime when there is unhandled exception from the target method public override void OnException(MethodExecutionArgs args) { string expMsg = string.Format("!!! Exception [{0}] {1} {2}", _hashCode, _methodName, args.Exception.Message); _logger.ErrorFormat(expMsg, args.Exception); } // Invoked at runtime when await starts in the target method public override void OnYield(MethodExecutionArgs args) { _logger.DebugFormat("--- OnYield [{0}] {1}", _hashCode, _methodName); } // Invoked at runtime when await resumed in the target method public override void OnResume(MethodExecutionArgs args) { _logger.DebugFormat("--- OnResume [{0}] {1}", _hashCode, _methodName); } } }
二、很重要的一步,PostSharp.Core 項目的 AssemblyInfo.cs 文件也須要在最後加上一句代碼。同上
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
好了,到此。 安裝,引用,配置已經所有結束。 開始測試...
建立新的Form,(什麼都不須要寫,就使用Load事件好了)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using log4net; using PostSharp.Core; using System.Reflection; namespace PostSharp.Demo { public partial class TestPostSharpFrm : Form { public static log4net.ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public TestPostSharpFrm() { InitializeComponent(); } [Trace] private void TestPostSharpFrm_Load(object sender, EventArgs e) { } } }
而後直接運行、能夠看見下面就是咱們在TraceAttribute.cs 中配置好的輸出格式
所有OK。 乾的很是漂亮!!!
From須要應用下面的命名空間
using log4net;
using PostSharp.Core;
using System.Reflection;
能夠看看編譯事後的代碼:
一、未使用PostSharp 的代碼
二、使用PostSharp 打過標籤的代碼
不難看出,PostSharp,會在編譯以後把Log注入到代碼中去。
同時每一個方法的執行位置一目瞭然...
源碼下載地址:http://files.cnblogs.com/files/chris-zeng/PostSharp.Demo.rar