(四)Apache log4net™ 手册 - AOP

news2024/9/23 3:14:41

0、引言

如果你已经开发了一个中型或者大型的 .NET / .NET Framework 项目但还没有为其添加日志系统。那么,你可能需要重新回顾大量的业务逻辑代码,并在其中找到合适的位置,编写合适的日志输出语句进行插入🙁。

显然,这是一个非常耗时且麻烦的工作,并且会对业务逻辑代码产生大量改动,造成代码的可读性变差。好在,我们可以利用面向切面编程(AOP)这一编程范式😀。在不修改现有代码的基础上,通过添加行为(Advice)来解决横切关注点;将通用功能(比如日志记录)从业务逻辑中抽离出来,使得我们能够专注于业务逻辑本身。

如果您不是很了解 AOP,那么以下的链接将会很有帮助:

  1. Aspect-oriented programming
  2. 细说Spring——AOP详解(AOP概览)
  3. Spring AOP(一) AOP基本概念
  4. 面向对象困境之 —— 横切关注点
  5. Aspect Oriented Programming
  6. What is Aspect-Oriented Programming (AOP)?
  7. AOP简单介绍

1、.NET 平台下的 AOP 实现

有非常多的编程语言都实现了 AOP,您可以在这里查看比较详细的列表。但我们的项目是基于 .NET / .NET Framework 的,使用的日志框架也是 log4net,所以我们重点关注 .NET 平台下的 AOP 框架:

名称logo描述
PostSharp.ilPOSTSHARP.ILPostSharp 旗下商业产品,一个基于 MSIL 的 .NET 下的面向切面框架,拥有功能受限的免费版本。
MetalamaMETALAMAPostSharp 旗下商业产品,一个 C# 中用于简洁代码的框架,拥有功能受限的免费版本。(MSDN 上提供了 Metalama 的教程)
Castle DynamicProxyDynamicProxy一个用于在运行时动态生成轻量级 .NET 代理的库。代理对象允许在不修改类代码的情况下拦截对对象成员的调用。类和接口都可以被代理,但是只有虚成员可以被拦截。许多其他框架(如 Spring.NET、AspectCore-Framework 等)都内部使用了 Castle DynamicProxy 来提供 AOP 功能。
Spring.NETSPRING.net一个全功能的 .NET 应用程序框架,不仅提供了依赖注入和面向切面编程(AOP),还提供了数据访问抽象、ASP.NET 集成等功能(更多详细介绍)。
AspectCore-FrameworkDynamicProxyAspectCore 是一个面向 .NET Core 和 .NET Framework 的基于 AOP 的跨平台框架。Core 支持切面拦截器、依赖注入集成、Web 应用程序、数据验证等。

以上都是最近仍有更新的项目;如果您想要了解还有哪些更多 .NET 平台下的 AOP 框架仍然是活跃的,可以参考如下回答:

  1. What is the best implementation for AOP in .Net?
  2. What Aspect-Oriented Programming (AOP) libraries for .NET are still actively developed?

2、实践

对于上面介绍的几个 .NET 平台下的 AOP 实现,笔者只用过 PostSharp.il(尽管它是一个商业产品)。一是其使用门槛不高,很容易上手;二是 PostSharp 还是提供了功能受限的免费版本 —— PostSharp [Essentials] 的,而且即便功能受限,完成日志记录这一简单需求还是绰绰有余的。

此外,PostSharp Technologies 为学生、教室、开源项目、MVP、博客作者、流媒体主播、用户组领导者以及黑客马拉松等提供了免费的 Metalama 和 PostSharp 许可证。如果您需要,完全可以在他们的官方网站上申请免费许可证,以体验完整版(PostSharp [Ultimate])的所有功能。

PostSharp [Ultimate] 包括以下所有单独的 PostSharp 产品:

  • PostSharp [Framework]:构建您自己的切面,并开始从您的 .NET 代码库中消除样板代码。
  • PostSharp [Logging]:在对源代码没有任何影响的情况下为您的 .NET 项目添加高度详细的日志记录。
  • PostSharp [MVVM]:消除 INotifyPropertyChanged 样板代码等。
  • PostSharp [Threading]:在 .NET 中编写可验证的线程安全代码,而不用绞尽脑汁。
  • PostSharp [Caching]:通过一个简单的自定义属性来提高您的 .NET 应用程序性能。

postsharp.il Products

到这里已经很明显了:如果我们只是想为现有的应用程序添加日志记录的功能。那么单独的 PostSharp [Logging] 产品就可以满足需求了。

以下是配置 PostSharp [Logging] 的简略步骤:

📌 为什么只有简略步骤?

因为所有步骤都非常简单,按照简略步骤中的外部链接提示操作即可。

  1. 首先创建一个简单的应用程序(比如:使用 .NET 创建 Windows 窗体应用)
  2. 有关如何开始使用 PostSharp.il 的介绍参考官方网站的 Get started 即可。
  3. 如何将 PostSharp [Logging] 添加到我们的代码库,参考官方文档的 Getting Started with PostSharp Logging 即可。
  4. 如何将 PostSharp [Logging] 连接到 log4net 目标日志框架,参考官方文档的 Writing PostSharp Logging events to log4Net 即可。
  5. 如何配置日志信息的详细程度,参考官方文档的 Adjusting Logging Verbosity 即可(可选步骤)。
  6. 下图展示了一个日志文件的生成位置及内容示例:
    生成的日志
  7. 完整源码请参考 WinFormsApp4DotNet

结果

最终我们(在对源代码没有任何影响的情况下)将日志记录添加到项目方法中。我们将获得程序执行的超详细日志,包括参数值和返回值。可以添加、删除或重命名方法或其参数;无需担心,日志条目将与每个更改保持同步。将日志记录添加到代码库并维护它成为一项非常简单的任务

📜 笔记
除了用于记录日志,面向切面编程(AOP)还有几种常见的应用场景:

  • 监控方法运行时间:通过 AOP 可以方便地统计方法的运行时间,从而进行性能分析;
  • 权限控制:通过 AOP 可以在方法执行前进行权限验证,从而实现统一的权限控制;
  • 缓存优化:例如,第一次调用查询数据库,将查询结果放入内存对象,第二次调用时,直接从内存对象返回,不需要查询数据库;
  • 事务处理:可以在方法执行前后进行事务的开启和提交,实现统一的事务管理;
  • 异常处理:可以在方法抛出异常后进行统一的异常处理;
  • 资源池管理:可以在方法执行前后进行资源的获取和释放,实现统一的资源管理;

总之,只要有大量重复的样板代码,或者有一些公共功能需要在多个地方使用,就可以考虑使用 AOP。

3、外部链接:

  • C#进阶系列——AOP?AOP!
  • 如何优雅地记录操作日志?
  • SpringBoot AOP 详解和多种使用场景
  • Spring AOP在项目中的典型应用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatisPlus逻辑删除注解@TableLogic

当我做了一个实体类,字段为del_flag的逻辑删除字段,要通过这个字段控制数据库中的数据逻辑删除。 重写mapper中的deleteById, 先按id查出数据,在更新此数据中的del_flag字段为1,调用update方法更新数据。 这种方式我…

adb: error: 46-byte write failed: Invalid argument

使用adb pull可以,但是adb push fail。 貌似是adb的问题,将adb.exe 重命名为pdb,使用pdb push就行了。

三季报开启消费电子增长新纪元?看蓝思科技如何落子

10月18日晚间,蓝思科技公布了2023年第三季度报告。根据报告,蓝思科技第三季度营业收入136.31亿元,同比增长9.98%,环比增长31.85%;归母净利润10.95亿元,同比增长2.93%,环比119.88%。 作为消费电…

OceanBase 全局索引与局部索引探索

OceanBase 全局索引与局部索引探索导致的本区域查找和跨区域查找。 作者:网名大数据模型,对制造业、银行业、通讯业了解多一点,关心专注国产数据库技术布道以及数据资产建设的应用实践。 爱可生开源社区出品,原创内容未经授权不得…

day02:DML DQL DCL

目录 一:DML 二:DCL 三:DCL 一:DML 1:概念:数据操作原因,对数据进行增删改。 2:三个操作 (1):增加:insert id name age gender 1 令狐冲 23 男 2(添加的数据)风清扬25男 1--->给指定字段添加数据:insert into 表名(字段1,字段2--)values…

基础课9——机器学习

1.概念 机器学习是一种数据分析技术,它使计算机能够像人类一样从经验中学习。机器学习算法使用计算方法直接从数据中获取信息,而不依赖于预定方程模型。当可用于学习的样本数量增加时,这些算法可以自适应提高性能。 机器学习是人工智能的一…

方法递归详解

什么是方法递归 方法直接调用自己或者间接调用自己的形式称为方法递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 递归的形式 直接递归:方法自己调用自己。 间接递归:方法调用其他方法,其他方法又…

Postman中几个body请求格式区别及使用说明

参阅:https://blog.csdn.net/qq_41063141/article/details/101505956,在此基础上添加代码使用说明 一、Params与Body 二者区别在于请求参数在http协议中位置不一样。 Params 它会将参数放入url中以?区分以&拼接 Body则是将请求参数放在请…

39.B树,B+树(王道第7章查找补充知识)

目录 一. B树 (1)B树的定义 (2)B树的高度 (3)B树的插入 (4)B树的删除 二. B树 (1)B树的定义 (2)B树与B树的区别 一. B树 &am…

什么是自动证书管理环境(ACME)

组织的网站需要 24x7 全天候可用,以建立信任并提供信息,如果网站因证书过期而停机,那么很难恢复失去的客户信任、收入和品牌声誉,手动管理证书基础结构会使组织面临中断、中间人 (MITM) 攻击等的严重风险。…

新上线游戏产品需不需要防御?

游戏运营免不了遭受恶意DDoS和CC攻击,且攻击常达百G以上,攻击流量过大,超过一般服务器的基础防护能力,不少企业面对大流量攻击显得束手无策,只能选择被迫停机,其次游戏行业利润高,很容易被黑客盯…

智慧矿山:如何快速识别带式运输机空载状态!

带式运输机作为一种常见的物料输送设备,广泛应用于矿山、建筑、化工等行业。但在使用过程中,经常会出现空载运行的情况,即带式运输机无物料传送时仍不停工作,导致能源和设备的浪费。因此,对带式运输机进行空载识别并采…

【期刊】IEEE系列指定期刊模版下载(LaTeX或者Word)全网最细教程

IEEE旗下有很多期刊,例如: IEEE Transactions on Pattern Analysis and Machine Intelligence IEEE Transactions on Cybernetics IEEE Transactions on Neural Networks and Learning Systems IEEE Transactions on Industrial Informatics IEEE Tra…

代理服务器可能有问题,或地址不正确的解决办法

问题: 解决办法: 1.找到代理服务器设置 2.代理服务器,设置关闭

基于springboot实现在线考试平台管理系统【项目源码+论文说明】计算机毕业设计

基于Springboot实现在线考试平台管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现在线考试的信息化管理。则对于进一步提高在线考试管理发展,丰富在线考试管…

[笔记] Windows 审计《一》判断是否SACL系统记录权限、DACL管理权限是否继承

文章目录 前言代码总结 前言 安全对象:由微软定义为可以具有安全描述符的对象,包括诸如文件,线程,远程注册表,Active Directory对象等许多东西。 安全描述符:包含许多字段的二进制结构,包括对…

K-Means和KNN

主要区别 从无序 —> 有序 从K-Means —> KNN KNN:监督学习,类别是已知的,对已知分类的数据进行训练和学习,找到不同类的特征,再对未分类的数据进行分类。K-Means:无监督学习,事先不知道…

一套成熟的ERP系统,应具备哪些能力?

随着制造业数字化、智能化的不断升级,企业的金字塔静态管理模式也在向扁平化动态管理模式转变,而企业管理系统则是推动这一趋势发展的重要载体。 为了更好地实现企业管理信息化,越来越多的企业在应用ERP系统。ERP对企业经营起着至关重要的辅…

Kafka-Java一:Spring实现kafka消息的简单发送

目录 写在前面 一、创建maven项目 二、引入依赖 2.1、maven项目创建完成后,需要引入以下依赖 2.2、创建工程目录 三、创建生产者 3.1、创建生产者,同步发送消息 3.2、创建生产者,异步发送消息 四、同步发送消息和异步发送消息的区别…

ChinaSoft 论坛巡礼 | 开源软件生态健康度量论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…