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=""/>
<!--
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..
-->
<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
PostSharp 结合 log4net 自动记录日志的更多相关文章
- .netcore3.1使用log4net/nlog记录日志
.netcore3.1使用log4net/nlog记录日志 .netcore3.1与2.x之间很是有不少差异的.本来想通过ctrl+c,ctrl+v将在2.2中实现的简单日志记录搬到.netcore3 ...
- SecureCRT配置自动记录日志
很多人用SecureCRT时,希望自动记录日志,一个是方便以后查阅,一个是对自己的操作有个记录.可以看看自己做了什么操作,有时甚至可以看看之前是不是犯了什么错,是个很不错的功能. 设置很简单,还可以根 ...
- SecureCRT使用之自动记录日志功能
自动记录日志功能: 选择"选项"--"全局选项",打开全局选项,在常规设置中找到"默认会话"设置项,点击右侧的"编辑默认设置&qu ...
- SecureCRT自动记录日志
From: http://lzj0470.iteye.com/blog/1189368 今天在推特上看到有人谈起SecureCRT日志记录的问题,貌似很多人都有这习惯 我是开始工作后才使用Secure ...
- 利用Log4net组件记录日志
项目中利用Log4net记录日志还是比较方便的,我也按照网上的一些操作进行了实践 参考文章 1:Log4Net使用指南2:LOG4NET日志配置 组件下载 log4net组件下载 1:设置配置文件,这 ...
- SecureCRT 7.0 如何自动记录日志
设置步骤如下: 1.打开SecureCRT ,在菜单里选择“选项”-->“全局选项” 2.然后选择“常规”--> “默认会话”--> “编辑默认设置” 3.然后选择“日志 ...
- 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)
一.基本用法 在LeakDiag中选择aaa.exe 然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop 会在c:\leakdi ...
- 在类库项目中使用log4net(RollingFileAppender)记录日志
1.创建解决方案 2.创建类库项目 3.根据需要修改命名空间,修改(和/或)添加类到类库 4.引用log4net 5.类库项目根目录下创建leg4net配置文件,如D3CallTriggerPlugi ...
- c#中使用log4net工具记录日志
首先,去官网下载log4net工具 链接http://logging.apache.org/log4net/download_log4net.cgi 目前最新的版本 log4net-1.2.15-bi ...
随机推荐
- Asp.net 中高亮显示搜索关键字简单方法
今天用到搜索时的高亮显示,百度了一下,如下面: 1.替换关键字,对字体变色. public static string ReplaceRed(string strtitle, stri ...
- WordVBA常用项
将光标所在段落选中 Selection.MoveUp unit:=wdParagraphSelection.MoveDown unit:=wdParagraph, Extend:=wdExtend ' ...
- jeesite快速开发平台(六)----代码生成模块介绍及使用
转自:https://blog.csdn.net/u011781521/article/details/79309861
- 使用WebLogic时控制台输出中文乱码解决方法
使用WebLogic时控制台输出中文乱码解决方法 1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一 ...
- Maven(一) Maven3 的安装与配置
Maven的安装以及环境变量的配置: a).在安装maven之前,先确保已经安装JDK1.7及以上版本,并且配置好JDK的环境变量. b).下载maven3,下载地址:http://maven.apa ...
- 纯C++binder服务和客户端实例
继承关系: 文件关系 IHelloService.h /* 参考: frameworks\av\include\media\IMediaPlayerService.h */ #ifndef ANDRO ...
- 迷你MVVM框架 avalonjs 学习教程8、属性操作
属性操作是DOM操作很大的一块,它包括类名操作,表单元素的value属性操作,元素固有属性的管理,元素自定义属性的管理,某些元素的一些布尔属性的操作.大多数情况下,元素属性的值是字符串类型,我们称之为 ...
- Spring Cloud Config配置中心的使用
一.概述 1. 为什么使用? 1> 配置文件太多,不方便维护 2> 配置文件一般都保存这各种明文显示的密码,无法保证配置内容的安全性,也无法做到按权限分配给个人 3> 更新配置项目需 ...
- Linux下MariaDB 安装及root密码设置(修改)
根据官方说明在/etc/yum.repo.d/下添加repo: # MariaDB 10.2 Fedora repository list - created 2017-11-25 05:55 UTC ...
- synchronized的简单理解
synchronized能够保证在同一时刻只有一个线程执行该段代码. 使用synchronized能够防止多个线程同时并发访问程序的某些资源. synchronized既可以修饰变量,也可以修饰方法, ...