我想将方法/函数名称添加到记录器,以便用户定义的方法/函数名称在 Azure Application Insights 中可见。控制器名称自动记录在 ActionName 属性下,但是日志记录不是在控制器中发生,而是在控制器调用的用户定义方法中发生。所以问题是;是否有一个中间件可以将所有日志附加到调用它们的方法/函数? 我正在开发 NET CORE 7 WebApi 并使用 Azure Application Insights。
据我所知,ASP.NET Core 使用日志范围来实现此功能(参见示例)。它可以做到这一点,因为此时控制器和操作方法已解析,您可以将此信息添加到范围中。对于管道中的未知方法调用显然无法做到这一点(至少在中间件中)。
我不知道一种简单的开箱即用的方法来实现(我很确定有第三方库可以做到这一点),但你有几个选择:
在方法中手动管理日志范围(参见官方文档)。
通过
ILogger
接口创建您自己的扩展方法,该方法将接受呼叫者信息属性。例如:
public static class LoggingExts
{
public static void LogInfoWithCaller(this ILogger logger, string message, [CallerMemberName] string callerMemberName = "", params object[] p)
{
// build new message and log it
}
}
虽然使用起来会有点麻烦(如果你使用
params
参数进行结构化日志记录):
logger.LogInfoWithCaller("qweeqw {test}", p: ["Test"]);
如果您广泛使用 DI,您可以使用装饰器模式。例如,您可以使用源生成器(或用于此类任务的其他一些自动化)来生成装饰器并相应地注册。