如何为一个程序集中的所有方法自动添加调用日志打印功能?
C# 自动方法/Setter调用日志实现方案
以下两种方案都不需要修改业务方法的内部代码,即可实现全局日志注入:
方案1:用Fody编译时IL织入(推荐,最省心)
通过Fody的MethodDecorator插件在编译阶段自动给目标方法插入日志代码,运行时无额外性能损耗:
- 首先安装两个NuGet包:
Fody、MethodDecorator.Fody - 自定义自动日志特性,代码如下:
using System; using System.Reflection; using MethodDecorator.Fody.Interfaces; [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false)] public class AutoLogAttribute : Attribute, IMethodDecorator { private string _methodName; private string _callerAssemblyName; public void Init(object instance, MethodBase method, object[] args) { _methodName = method.Name; _callerAssemblyName = Assembly.GetCallingAssembly().GetName().Name; } public void OnEntry() { } public void OnException(Exception ex) { } public void OnExit() { Console.WriteLine($"Method [{_methodName}] was called. Calling assembly: {_callerAssemblyName}"); } }
- 要覆盖整个文件的所有方法和setter,直接在对应的类上方加
[AutoLog]特性即可,原业务代码不需要做任何改动:
[AutoLog] public class YourBusinessClass { private readonly DoService _do; // 调用时会自动在末尾打印日志 public void Test() => _do.Something(); // 赋值Setter时也会自动触发日志 public string UserName { get; set; } }
如果你完全不想修改原有业务代码,连特性都不想加,可以在项目根目录新建
FodyWeavers.xml配置文件,配置全局匹配规则,指定要覆盖的类、命名空间范围,Fody会自动给所有符合条件的方法织入日志,不需要改动任何原有代码。
方案2:.NET 8+ 内置拦截器(无第三方依赖)
如果不想引入第三方库,可以用.NET 8新增的拦截器预览功能实现:
- 先在项目配置文件中开启拦截器功能:
<PropertyGroup> <Features>InterceptorsPreview</Features> </PropertyGroup>
- 编写拦截器代码,指定要拦截的目标类的所有方法、属性Setter,编译时会自动把原方法的调用指向你封装后的方法,在封装方法中执行完原逻辑后追加日志即可,同样不需要修改原有业务代码。
内容的提问来源于stack exchange,提问作者Jesús-QC
相关产品推荐
相关产品推荐

