PostSharp Logging 添加 >>> 和 <<< 到方法进入/退出日志条目

Posted

技术标签:

【中文标题】PostSharp Logging 添加 >>> 和 <<< 到方法进入/退出日志条目【英文标题】:PostSharp Logging Add >>> and <<< to Method Entry/Exit Log Entries 【发布时间】:2021-11-23 20:18:52 【问题描述】:

有人可以告诉我是否可以将 >>> 和

Google 不是朋友,PostSharp 的文档也没有帮助。我知道在哪里可以创建自定义格式化程序或后端,但在这些示例中我没有看到如何自定义方法入口与方法出口的日志条目。

带有 NLog 的实际 PostSharp 日志输出

2021-10-01 16:29:16.5539|DEBUG|jaslibdss.libddss|    libddss.get_Database()|Starting.
2021-10-01 16:29:16.5539|DEBUG|jaslibdss.libddss|    libddss.get_Database()|Succeeded: returnValue = "master", executionTime = 0.11 ms.

所需的带有 NLog 的 PostSharp 日志输出

2021-10-01 16:29:16.5539|DEBUG|jaslibdss.libddss|   >>> libddss.get_Database()|Starting.
2021-10-01 16:29:16.5539|DEBUG|jaslibdss.libddss|   <<< libddss.get_Database()|Succeeded: returnValue = "master", executionTime = 0.11 ms.

我正在使用以下内容:

NLog nuget 4.7.11
PostSharp nuget 6.9.9
PostSharp.Patterns.Diagnostics nuget 6.9.9
PostSharp.Patterns.Diagnostics.NLog nuget 6.9.9

我正在使用直接从他们的示例中提取的 NLog 配置:

      // Configure 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));



      // Configure PostSharp Logging to use NLog.
      LoggingServices.DefaultBackend = new NLogLoggingBackend(new LogFactory(nlogConfig));

      LogManager.EnableLogging();

我没有任何其他代码要显示,因为我不知道从哪里开始编写代码。

*** 编辑 ***

    internal class MyBackend : NLogLoggingBackend
    
        public override MyLogBuilder CreateRecordBuilder()
        
            return new MyLogBuilder(this);
        
    

    internal class MyLogBuilder : NLogLogRecordBuilder
    
        public MyLogBuilder(NLogLoggingBackend backend) : base(backend)
        
           
        

        protected override void Write()
        

        
    

到目前为止尝试过,但“受保护的覆盖无效写入()”告诉我没有合适的写入方法可以覆盖。但是,我确实看到了 WriteCustomString 方法。你是这个意思吗?

*** 编辑#2 ***

    internal class MyBackend : NLogLoggingBackend
    
        public MyBackend(LoggingConfiguration config) : base(new LogFactory(config))
        

        

        public override MyLogRecordBuilder CreateRecordBuilder()
        
            return new MyLogRecordBuilder(this);
        
    

    internal class MyLogRecordBuilder : NLogLogRecordBuilder
    
        public MyLogRecordBuilder(NLogLoggingBackend backend) : base(backend)
        

        

        public void Write()
        
            if (this.RecordKind == LogRecordKind.MethodEntry)
            
                base.Write(new PostSharp.Patterns.Formatters.UnsafeString(">>> Hello, world!"));
            
            
            if (this.RecordKind == LogRecordKind.MethodSuccess)
            
                base.Write(new PostSharp.Patterns.Formatters.UnsafeString("<<< Hello, world!"));
            
        
    

然后

            // Configure 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();


            // Configure PostSharp Logging to use NLog.
            NLogLoggingBackend b = new MyBackend(nlogConfig);
            //b.Options.IndentSpaces = 0;
            LoggingServices.DefaultBackend = b;

但是,我遇到了堆栈溢出错误。 :/

*** 编辑 3 ***

    public class MyBackend : NLogLoggingBackend
    
        public MyBackend(LoggingConfiguration config) : base(new LogFactory(config))
        
            Options.IndentSpaces = 4;
            Options.Delimiter = " - ";
            Options.IncludeType = false;
        

        public override MyLogRecordBuilder CreateRecordBuilder()
        
            return new MyLogRecordBuilder(this);
        
    

    [Log(AttributeExclude = true)]
    public class MyLogRecordBuilder : NLogLogRecordBuilder
    
        public MyLogRecordBuilder(NLogLoggingBackend backend) : base(backend)
        
            System.Console.WriteLine(@"DEBUG---" + backend.Options.Delimiter);
            System.Console.WriteLine(@"DEBUG---" + backend.Options.IndentSpaces);
        

        protected override void Write(UnsafeString message)
        
            if (this.RecordKind == LogRecordKind.MethodEntry)
            
                base.Write(new PostSharp.Patterns.Formatters.UnsafeString(">>> Hello, world!"));
            

            if (this.RecordKind == LogRecordKind.MethodSuccess)
            
                base.Write(new PostSharp.Patterns.Formatters.UnsafeString("<<< Hello, world!"));
            
        
    

Edit #3 是我当前有效的代码。我现在在日志条目文本中使用 >> 获取日志输出。但是,我无法应用任何 backend.Options。例如,我坚持使用 | 的默认分隔符。而且我根本没有任何缩进。

注意:在我上面的两个 DEBUG WriteLine 中,我确实看到了预期的“-”选项值和 4 个用于缩进的空格。

问题:当我覆盖 Write 方法时,我是否需要添加任何特殊的东西来使用这些选项,或者这些选项是否应该应用而我做错了什么?

【问题讨论】:

【参考方案1】:

您必须创建一个从NLogLoggingBackend 派生的自定义日志记录后端。

创建一个派生自NLogLoggingBackend的类。

创建一个派生自NLogLogRecordBuilder的类。

覆盖 NLogLoggingBackend.CreateRecordBuilder 使其返回您的 NLogLogRecordBuilder 的新实例。

覆盖NLogLogRecordBuilder.Write。您可以使用自己的字符串调用基本的NLogLogRecordBuilder.Write 方法。

或者,您也可以直接调用 NLog.Logger,您可以从表达式((NLogLoggingTypeSource) this.TypeSource).Logger 中获取。 要确定消息的类型(条目、成功、失败),请使用LogRecordBuilder.RecordKind

或者,您可以覆盖 AppendProlog 并在调用 base.AppendProlog 之前插入您的 &gt;&gt;&gt;&lt;&lt;&lt;(通过将其附加到 this.StringBuilder),但是您的字符甚至会在缩进之前插入。

【讨论】:

根据您的输入更新了我迄今为止尝试过的问题。但是,我没有看到要覆盖的 Write 方法。你是说 WriteCustomString 吗? 并不是要编辑您的答案!对不起! :// 您需要在记录生成器中覆盖的方法是protected override void Write( UnsafeString message ) 谢谢。这有帮助。弄清楚了。将此标记为已接受的答案。再次感谢。欣赏它。 当我重写 LogRecordBuilder 中的 Write 方法时,我设置的 Backend.Options 是否应该自动应用,还是我需要做一些事情来让它们应用?我已经用 >>> 和

以上是关于PostSharp Logging 添加 >>> 和 <<< 到方法进入/退出日志条目的主要内容,如果未能解决你的问题,请参考以下文章

采用PostSharp实现

使用 PostSharp 调试的 TFS 构建 |任何 CPU

使用我们自己的 Nuget 包安装时,如何将 PostSharp 包含在 ASP.NET WebApi 项目的构建过程中?

WPF + PostSharp'ed View模型在一分钟内冻结

PostSharp零基础快速入门

PostSharp AOP