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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:57:01