如何在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
相关产品推荐
相关产品推荐

