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

如何在NLog日志输出中添加分部类对应的具体文件名?

问题:分部类日志中输出对应具体文件名

场景与现有实现

我正在开发一套客户端/服务器应用,需要追踪消息交互流程,因此在所有发送消息的位置添加了以下代码:

if (cfg_Following_Messages.Value != 0)
    log.Debug($"About to broadcast [{message.GetType().Name}]");
new OwnMessageHandler.BroadcastClientMessage(message).Execute();

通过NLog的log.Debug可以看到负责发送消息的类名,但问题在于服务器的核心逻辑基于单个分部类Manager,该类拆分在多个文件中(如Manager.Order.cs、Manager.Client.cs等),每个文件的结构如下:

public partial class Manager{
    // 对应文件的逻辑代码
}

即使修改日志代码,尝试输出当前实例的类型名:

log.Debug($"About to broadcast [{message.GetType().Name}] by [{this.GetType().Name}]");

得到的日志输出依然无法区分具体文件:

2023-10-27 13:43:33.6548 | <Namespace>.Manager | About to broadcast [SpecificTypeOfMessage] by [Manager]

我期望的日志输出是能明确显示消息来自哪个分部类文件:

2023-10-27 13:43:33.6548 | <Namespace>.Manager | About to broadcast [SpecificTypeOfMessage] by [Manager.Specific.cs]

已尝试的方案及局限性

  • StackFrame方案:可以正确获取到具体文件名,但每次消息交互都要获取完整调用栈,会导致严重的性能损耗,不符合需求。
  • Caller Information方案:在方法签名中添加, [CallerFilePath] string filePath = "",并通过string filename = filePath.Substring(filePath.LastIndexOf("\\") + 1);提取文件名,但得到的是Manager.cs而非实际的分部类文件;同时我不想修改方法签名。

提问

有没有其他方法可以在不修改方法签名、不引入严重性能问题的前提下,在日志中输出分部类对应的具体文件名?

内容的提问来源于stack exchange,提问作者Dominique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:34:55