• post sharp 与log4net 结合使用,含执行源码 转拷


    环境:
    
    VS 2012
    
    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.3
    
    首先搭建环境:
    
    下载好PostSharp 之后进行安装。之后创建项目
    
    1、引用PoastSharp
    
    PoastSharp引用方式如下:
    
    VS工具 —>> NuGet 程序包管理 —>> 管理解决方案的NuGet程序包       出现如下图:
    
    搜索PostSharp 安装等待...
    
    
    
    安装完成之后会在项目的解决方案同级目录下出现下列文件:
    
    
    
    同时解决方案里面的项目会自动出现PostSharp的引用、
    
    
    
    如果没有自动引用,我们就手动引用下就好了。 根据.NET Framework的版本,选择对应的dll
    
    PostSharp.dll  安装引用已经OK了。
    
    2、log4net安装引用
    
    打开 VS工具 —>> NuGet 程序包管理 —>>  程序包管理器控制台
    
    在控制台中输入 PM> Install-Package log4net  (PM> 是已经有了的)敲回车键
    
    然后安心等待...(上面的红色的Error是因为网速比较慢,没有Load出来, 没有关系再来一次)
    
    下面第二次可以看见已经安装成功,并且把我的机器上老版本替换掉了。   干得漂亮!!!
    
    
    
    如PostSharp 一样,也会在解决方案下面出现lib文件, 如果项目里面没有引用的就手动引用好了。
    
    接下来开始正真的干活了......
    
    首先配置好log4net.config
    
    下面是我习惯的步骤:
    
    1、在应用程序下创建 App.config 文件
    
    
    
    2、修改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="LogClient_%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>
    
    View Code
    
    3、接着很重要的一步,不然配置的都白干了...
    
    打开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 ");
        }
      }
    }
    View Code
    
    
    然后生成运行。
    
    运行成功之后,关掉Form。  打开bin/Debug 可以看见有一个Log文件夹里面会生成一个日志文件,打开可以看见我们刚才写的 test log4net
    
    好的。 干得漂亮!!! 已经成功一半了。即使不用postSharp也可以完成日常的打Log了。
    
    
    
    为了继续完善,把PostSharp使用起来,让它给我们自动的打Log。
    
    1、创建项目 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);
      }
        }
    }
    View Code
    
    
    2、很重要的一步,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)
      {
      }
        }
    }
    View Code
    
    
    然后直接运行、可以看见下面就是我们在TraceAttribute.cs 中配置好的输出格式
    
    
    
    全部OK。  干的非常漂亮!!!
    
    From需要应用下面的命名空间
    
    
    using log4net;
    
    using PostSharp.Core;
    
    using System.Reflection;
    
    可以看看编译过后的代码:
    
    1、未使用PostSharp 的代码
    
    
    
    2、使用PostSharp 打过标签的代码
    
    
    
    不难看出,PostSharp,会在编译之后把Log注入到代码中去。
    
    同时每个方法的执行位置一目了然...
    

      

  • 相关阅读:
    C# 添加修改防火墙端口及程序
    Winform 多线程--解决界面卡死问题
    ScreenOper
    KVM的VPS主机在Centos6.x下修改系统时间
    Java IO和File类
    Java动态代理Proxy类源码分析
    Java IO之字节流
    Java IO之字符流
    两台计算机之间如何通讯
    Java引用类型原理
  • 原文地址:https://www.cnblogs.com/hualiu0/p/4926691.html
Copyright © 2020-2023  润新知