【问题标题】:How to use postsharp with Serilog to separate logging aspect?如何使用带有 Serilog 的 postsharp 来分离日志记录方面?
【发布时间】:2019-04-23 08:03:16
【问题描述】:

我是AOP 的初学者,我尝试使用PostSharpSeriLog 来记录我的MVC application

所以我发现这个sample 示例作为一个开始,但我想知道在这个示例中它是否像这样明确地使用记录器:

activity.Write(LogLevel.Warning, "The entity {id} has been marked for deletion.", item.Id);

在商务舱QueueProcessor,那么这方面的价值是什么!我还在写日志代码和业务代码!。


有人可以帮我分离 MVC 项目的注销使用 PostSharp.Patterns.Diagnostics.Backends.Serilog?

【问题讨论】:

    标签: c# asp.net-mvc aop postsharp serilog


    【解决方案1】:

    当您使用 LogAttribute 方面时,PostSharp 会自动生成在方法执行前后发出日志记录的代码。但有时您会想要编写自己的记录。例如,您可能想要记录自定义错误或警告。即使禁用跟踪级别日志记录,您也可能希望显示此消息。但是当它启用时,您希望此消息出现在正确的上下文中,并带有适当的缩进。 对于这些场景,您可以使用 Logger 类提供的方法。

    在示例类中,手动添加了一些关于业务逻辑的自定义日志。


    首先,您必须从这里下载它: https://www.postsharp.net/download

    安装插件后,在 Visual Studio 中创建一个项目。 在解决方案资源管理器中,通过右键单击项目或在您的代码文件中,通过右键单击类或方法名称,您可以将 PostSharp 添加到您的项目中。

    项目中添加了默认配置和属性。 之后,您将更改配置、格式,可能会根据您的需要添加自定义方面类。

    继续阅读这些文档会很有用:

    https://doc.postsharp.net/logging

    https://doc.postsharp.net/serilog

    【讨论】:

      【解决方案2】:

      你误解了这个例子,让我澄清一下。

      示例代码中有两种日志记录。您找到了明显的activity.Write(xxx)。使用 PostSharp 之类的 AOP 框架不涵盖这种日志记录。这种日志记录可以看作是业务逻辑的一部分,因为它特定于正在发生的操作。

      现在,另一方面:假设您要记录对应用程序中所有方法的每次调用。您想记录何时调用该方法以及使用哪些参数。此外,您还想记录返回的值(如果有)。

      想象不得不为每个方法写这样的东西:

      bool SomeMethod(int input)
      {
          var sw = Stopwatch.StartNew();
          logger.Write($"Started executing {nameof(SomeMethod)} at {DateTime.Now}. Value of {nameof(input)}: {input})";
      
          ... // some work
          var returnValue = false;
      
          sw.Stop();
          logger.Write($"Finished executing {nameof(SomeMethod)}. It took {sw.ElapsedMilliseconds}ms. Returned value: {returnValue}");
      
          return returnValue;
      }
      

      现在 that 是一个横切关注点,而 that 就是这个例子所展示的。这个管道代码由 PostSharp 通过在 program.cs 中执行此操作注入:

      using PostSharp.Patterns.Diagnostics;
      using PostSharp.Patterns.Diagnostics.Backends.Serilog;
      using PostSharp.Samples.Logging.BusinessLogic;
      using Serilog;
      
      // Add logging to all methods of this project.
      [assembly: Log]
          ...
      

      更多详情here

      现在,最后,让我们回到你的问题:

      有人可以帮助我使用 PostSharp.Patterns.Diagnostics.Backends.Serilog 将 MVC 项目的注销分开吗?

      我不确定您对任何 AOP 框架对业务逻辑代码中的自定义日志的期望。你能扩展一下吗?还是上面的说明就够了?

      编辑:解决您评论中的问题

      1. 我不认为 PostSharp 的示例是 DDD 示例。他们只是证明了用于方面的记录器也可用于记录业务相关信息(实体被标记为删除。)在 DDD 中,如果此信息与某人或某物相关,则可以使用方面记录的事件.
      2. 通过使用审计方面来捕获事件来创建审计跟踪无疑是正确的方法。至于表示层,您可以使用一些中间件来记录请求和响应,例如演示的here。在这种情况下,不需要使用 PostSharp。根据您在 DDD 应用程序中的事件代码,您可能能够在事件发送之前或之后拦截事件,以便您也可以在那里编写自己的日志记录,从而无需 PostSharp。
      3. 您是否尝试了在已标记为重复的问题的答案中听取的步骤?

      【讨论】:

      • 非常感谢,但我有三个问题:1-"This kind of logging can be seen as part of the business logic as it is specific to the actions that are taking place." 如何将Log 视为我业务的一部分?,这不是我业务的一部分,我关注DDD 所以我必须将我的域与任何框架或任何方面隔离开来,因此我希望通过 postsharp 记录内部的操作方法。 2-我通过记录方面来定位MVC(表示层),我通过审计方面来定位Domain layer,我在正确的轨道上吗?
      • 3-我尝试将日志记录方面和所需的配置隔离在它自己的类库中,但我收到以下错误:stackoverflow.com/q/53396131/418343
      • Did you try the steps listened in the answers of the question that has been marked as the duplicate? 是的,我做到了,但徒劳无功
      • 您能否总结一下您的想法,我该如何开始使用AOP 记录和审核我的应用程序(DDD)
      • 您的代码中是否使用了任何 ddd 框架?你用什么作为事件总线。媒体?
      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多