当前位置: 首页 > 知识库问答 >
问题:

PostSharp日志将>>>和

弓举
2023-03-14

有人能告诉我是否可以添加

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

实际PostSharp日志输出w/NLog

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.

需要的PostSharp日志输出,带NLog

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()
        {

        }
    }

到目前为止,已尝试此操作,但“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!"));
            }
        }
    }

编辑#3是我当前有效的代码。我现在正在使用获取日志输出

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

问:当我覆盖写入方法时,我需要添加任何特殊的东西来使用这些选项,还是应该应用这些选项并且我做错了什么?

共有1个答案

慕容烨
2023-03-14

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

>

  • 创建一个派生自NLogLoggingBackend的类。

    创建一个派生自NLogregRecordBuilder的类。

    覆盖NLogLoggingBackend。创建RecordBuilder,以便它返回NLogLogRecordBuilder的新实例。

    覆盖NLogLogRecordBuilder。编写。您可以调用基NLogLogRecordBuilder。使用您自己的字符串编写方法。

    • 或者,您也可以直接调用NLog。Logger,您可以从表达式((NLogLoggingTypeSource)中获取。类型源)。记录器

    或者,您可以重写AppendProlog并插入您的

  •  类似资料:
    • 将PostSharp用于C#应用程序,我有以下场景: Namespace_ACustomLoggingMethod Namespace_B.DoThings thingMethod(实际上是几种不同的方法) DoMomthingMethod调用CustomLoggingMethod,它以所需的格式创建日志条目并且运行良好。正如预期的那样,日志条目将源记录为CustomLoggingMethod,我

    • 我正在尝试使用PostSharp和multicastAttribute实现日志记录。使用PostSharp诊断库中的日志功能。 我有一个GlboalAspects。启动项目目录中的cs。内容如下。 右键单击我的项目并选择属性,默认命名空间是“alp_generator” 我不知道“PostSharp.Patterns.Diagnostics.LogAttribute”是否正确。 我根本没有日志记录

    • 我正在测试使用PostSharp记录我的方法(log4net)的进入和退出。我遇到的问题是我希望日志消息是一个json对象,而不是您默认获得的内容,即: 输入:MyClass。MyMethod(参数) 我想要一些东西,比如{“动作”:“进入”,“类”:“我的类”,“方法”:“我的方法”等} 这是因为我使用loggly来解释日志,而使用json日志消息可以更好地进行过滤、搜索等。 这有可能吗?

    • PostSharp读取.NET字节模块,转换成对象模型。让插件分析和转换这个模型并写回到MSIL。 PostSharp使开发程序分析应用程序容易得像分析代码规则和设计模式,它使程序开发的思想变革为面向方面软件开发(AOSD/AOD)思想。 PostSharp is a tool that can reduce the number of lines of code in all major Mic

    • 我正在开发一个应用程序,使用我的另一个项目作为maven依赖项。 期望 我希望我的依赖项使用自己的回退.xml登录自己的文件。我希望应用程序使用自己的 logback.xml文件登录到控制台和一个与依赖项不同的文件。我希望这两个文件都位于应用程序jar附近的日志文件夹中。 它现在做什么 但是目前,应用程序和依赖项都使用应用程序的logback.xml,所有内容都记录在控制台和同一个文件中。 我该如

    • 我试图建立一个应用程序,使用log4j使日志文件。日志文件的位置通过log4j.properties文件提供。 到目前为止,它运行良好,但我想将spark日志与我从代码生成的日志分开。或者至少在日志文件中打印我的日志消息。 有办法吗? log4j.properties