PostSharp Logging方法进出日志加>>>、<<<标记及配置生效问题
实现方案
是可以为PostSharp Logging的方法进入、退出日志添加>>>/<<<标记的,你自定义日志后端的方向是正确的,当前Options不生效的原因是你重写Write方法时直接丢弃了PostSharp已经根据Options配置生成好的原始日志内容,仅传入了自定义的固定字符串,因此原有格式化逻辑全部失效。
修正后的可运行代码
1. 自定义日志记录构造器
[Log(AttributeExclude = true)] public class MyLogRecordBuilder : NLogLogRecordBuilder { public MyLogRecordBuilder(NLogLoggingBackend backend) : base(backend) { } protected override void Write(UnsafeString message) { var originalMsg = message.ToString(); string modifiedMsg = originalMsg; var indent = new string(' ', Backend.Options.IndentSpaces); switch (RecordKind) { // 方法进入加>>> case LogRecordKind.MethodEntry: if (originalMsg.StartsWith(indent)) { modifiedMsg = $"{indent[..^3]}>>> {originalMsg[Backend.Options.IndentSpaces..]}"; } else { modifiedMsg = $">>> {originalMsg}"; } break; // 方法成功/异常退出加<<< case LogRecordKind.MethodSuccess: case LogRecordKind.MethodException: if (originalMsg.StartsWith(indent)) { modifiedMsg = $"{indent[..^3]}<<< {originalMsg[Backend.Options.IndentSpaces..]}"; } else { modifiedMsg = $"<<< {originalMsg}"; } break; } // 将修改后的内容传给基类,保留原有所有Options配置的生效逻辑 base.Write(new UnsafeString(modifiedMsg)); } }
2. 自定义后端
public class MyBackend : NLogLoggingBackend { public MyBackend(LoggingConfiguration config) : base(new LogFactory(config)) { // 所有Options配置都会正常生效 Options.IndentSpaces = 4; Options.Delimiter = "|"; Options.IncludeType = false; } public override NLogLogRecordBuilder CreateRecordBuilder() { return new MyLogRecordBuilder(this); } }
3. 服务注册逻辑
和你之前的注册代码一致即可:
// 配置NLog var nlogConfig = new LoggingConfiguration(); var fileTarget = new FileTarget("file") { FileName = "nlog.log", KeepFileOpen = true, ConcurrentWrites = false, }; nlogConfig.AddTarget(fileTarget); nlogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget)); var consoleTarget = new ConsoleTarget("console"); nlogConfig.AddTarget(consoleTarget); nlogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, consoleTarget)); LogManager.EnableLogging(); // 注册自定义后端 LoggingServices.DefaultBackend = new MyBackend(nlogConfig);
说明
- 代码中保留了原始日志的缩进逻辑,仅将缩进的最后3个空格替换为
>>>/<<<加一个空格,和你期望的输出格式完全匹配 - 所有
Backend.Options的配置(分隔符、缩进长度、是否显示类型等)都会正常生效,无需额外处理 - 可根据需要自行扩展其他日志类型的标记规则
内容的提问来源于stack exchange,提问作者user17055229
相关产品推荐
相关产品推荐

