You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为一个程序集中的所有方法自动添加调用日志打印功能?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:03