码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • (四)Apache log4net™ 手册 - AOP


    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在项目中的典型应用场景
  • 相关阅读:
    接口自动化测试是个啥?如何开始?什么是框架?带你揭开神秘面纱
    MC我的世界大型生存服务器配置推荐首选I9-13900K高频服务器
    判断一个字符串是否括号匹配
    自然语言处理 Paddle NLP - 快递单信息抽取 (ERNIE 1.0)
    传奇架设gom引擎常见问题
    虚拟主机 克隆机 域名解析
    有什么好用的IT资产管理软件
    熊市下PLATO如何通过Elephant Swap,获得溢价收益?
    uview使用u-action-sheet添加滚动条
    自学黑客(网络安全),一般人我劝你还是算了吧
  • 原文地址:https://blog.csdn.net/YMGogre/article/details/134033542
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号