PostSharp 结合 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="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>

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 ");
        }
    }
}

然后生成运行。

运行成功之后,关掉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);
        }
    }
}

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)
        {

        }
    }
}

然后直接运行、可以看见下面就是我们在TraceAttribute.cs 中配置好的输出格式

全部OK。  干的非常漂亮!!!

From需要应用下面的命名空间

using log4net;
using PostSharp.Core;
using System.Reflection;

可以看看编译过后的代码:

1、未使用PostSharp 的代码

2、使用PostSharp 打过标签的代码

不难看出,PostSharp,会在编译之后把Log注入到代码中去。

同时每个方法的执行位置一目了然...

源码下载地址:http://files.cnblogs.com/files/chris-zeng/PostSharp.Demo.rar

时间: 2024-11-08 20:19:28

PostSharp 结合 log4net 自动记录日志的相关文章

用Yii框架实现AR类自动记录日志

定义一个新的AR类MyActiveRecord并继承CActiveRecord类,然后定义日志处理事件RecordLog: public function RecordLog($objEvent) {        //记录日志操作,需要在各个类中各自实现 } 2. 在类初始化的时候为记录日志事件附加一个事件处理程序,即绑定日志记录事件: public function init() {        //绑定日记记录事件 $this->attachEventHandler('onRecordL

c#中使用log4net工具记录日志

首先,去官网下载log4net工具 链接http://logging.apache.org/log4net/download_log4net.cgi 目前最新的版本 log4net-1.2.15-bin-newkey.zip 下载之后,目录log4net-1.2.15-bin-newkey\log4net-1.2.15\bin\net\4.0\release 里面的log4net.dll就是我们要引用的dll了. 新建一个winform程序,添加引用 然后在程序配置文件App.conifg中加入

secureCRT自动记录日志

为了方便记录自己的操作,和追究责任,我喜欢在secureCRT中记录日志方法如下:Options->Global Opations->Default Session->Edit Default Settings->Log File 填写日志文件位置,勾选下方的Start Log upon connect位置我喜欢这么写:F:\crtlog\%H_%Y-%M-%D_%h%m%s.log

使用Spring Aop自定义注解实现自动记录日志

百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为spring容器中配置@aspectj切面的bean创建代理 ,织入切面 --> <aop:aspectj-autoproxy /> <!-- 开启注解扫描 --> <context:component-scan base-package="com.ky.zhjd.**&q

SecureCRT配置自动记录日志

1.在菜单里选择"Options选项"--"Global Options全局选项" 2.log file name D:\Program Files\SecureCRT(1)\logsss\%M%D-%h:%m-%H.log 3.可以在"On each line在每行"这个设置里填写[%h:%m:%s] 这样就会记录每行日志打入的时间. 4.options prompt for filename 每次提示用户输入日志名字 Start log up

Log4Net指南

Log4Net指南 英文好的直接看这里:http://www.codeproject.com/Articles/140911/log4net-Tutorial 介绍 log4net.是.NET下面最伟大的日志工具之一.简单.强大.可扩展,简直是日志工具的黄金标准. 在我看来唯一欠缺是一个比较直接的使用指南. 这个文档,在深度主要讲如何使用,但它还是有点模糊.基本上,如果你已经知道log4net能做什么,如果你只是想知道语法,那么这个文档就适合你了.外面的文档通常是针对一类系统. 我希望我的这份指

基于log4net的日志组件扩展分装,实现自动记录交互日志 XYH.Log4Net.Extend

背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或者项目中某一次执行情况的跟踪监控 根据log4net的现有功能满足不了实际需求,所以需要以log4net为基础进行分装完善,现在分装出了一个基础的版本,如有不妥之处,多多指点功能简介: 该组件是在log4net的基础上,进行了一定的扩展封装实现的自动记录交互日志功能 该组件的封装的目的是解决一下几个

在C#代码中应用Log4Net(二)典型的使用方式

不管用什么框架,学什么东西,最初的想法还不是尽快地用上这个框架,所以我们在这个章节还是不打算介绍具体配置节的应用,而是直接给出一个经典的使用样例,让你尽快上手.即使你对Log4Net的配置不熟悉也完全没有关系. (下面的文章假定你已经看过了第一篇,当然在有的操作中,我还是会简单地重复第一篇,以便加深你的记忆) 先说说这篇教程的思路,我们打算使用Log4Net,首先必须先引入Log4Net的库:然后我们要对Log4Net进行一些配置:最后,我们会在代码里面使用它. 1.引入Log4Net.dll组

log4net 日志框架的配置

log4net 日志框架的配置(一) 添加对log4net程序集的引用 选择程序集文件添加引用即可,需要注意的是需要添加相应程序版本的程序集,如果你的应用是基于.netFramework2.0,则应选择net 2.0版本的程序集 修改配置文件,配置log4net相关设置 在web.config或在app.config(如果没有则创建一个)中,配置log4net的使用 1 <?xml version="1.0"?> 2 3 <configuration> 4 &l