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

如何在使用PostSharp时记录特定语句?

商绍元
2023-03-14

我已经尝试PostSharp AOP一段时间了。我能够设计简单的方面并很好地使用它们。但是我正在努力找到实现这个场景的最佳方法。

场景:

>

在方法中记录开发人员指定的语句。

假设我构建了一个Apsect(LogMethodAspect),在进入和退出期间记录该方法。

但是,现在我想记录一条特定的语句。我希望此语句是同一日志的一部分。

选项:

  1. 创建另一个将记录参数的方面(LogStatementAspect),现在当我要记录语句时调用此方法
  2. 使用一个名为“LogThis”的方法创建一个接口,并在程序集中指定专门用于“LogThis”方法的方面

我试图找到一种适当的方式,使它需要最少的依赖。

您可以在语句上创建方面吗?您能直接调用底层Aspect方法吗?

任何帮助都会很好。

示例伪代码:

[LogMethodAspect]
Mothod1 (input1, input2)
{
   Do Something

   "Log this info" // How can I re-use the logging methodology already created in the aspect - LogMethodAspect


   Do Something more
}

共有1个答案

沈俊明
2023-03-14

通常,不可能将方面应用于方法内部的特定语句。此外,方面应该与您的应用程序逻辑正交,因此您的方法内部的代码不应通过直接方法调用耦合到应用于此方法的方面。

如果您想要记录的特定语句也是一个方法调用,那么您应该能够在被调用的方法上应用相同的方面。即使该方法位于没有源代码的外部程序集中,也可以应用该方面。在这种情况下,在程序集中应用方面时,需要设置AttributeTargetAssemblys属性:

[assembly:LogMethodAspect(AttributeTargetAssemblies="SomeAssemblyName", AttributeTargetTypes = "...")]

如果您不想记录方法调用,而是想记录一些任意信息,我建议您实现一个底层日志提供程序,该提供程序将从您的代码中需要记录这些额外信息的方面和点进行调用。

public interface ILogger
{
    void Log(string message);
}

[Serializable]
public class LogMethodAspect : OnMethodBoundaryAspect
{
    private ILogger logger;

    public override void RuntimeInitialize(MethodBase method)
    {
        this.logger = // get the shared logger instance
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        // ...
        this.logger.Log("Entering: " + method_name + arg_values);
    }
}

class Class1
{
    [LogMethodAspect]
    void Method1 (input1, input2)
    {
        // Do Something

        // using the same shared logger
        logger.Log("Log this info")

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

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

  • 我想创建一个控制台附加器,显示一些日志信息,并打印出一个特定的http标头,类似于: 我创建了一个如下所示的< code>logback-spring.xml文件,但是“my-header”只是空白的。 我知道使用< code>logback-access可以访问HTTP请求/响应属性,但是当我尝试设置编码器类时,我无法使用任何经典的logback转换词: 上面的日志给出了以下错误: 如何访问请求

  • 我试图通过连接eclipse IDE中的Oracle数据库,使用JDBC程序启用日志。 我已经完成了这个SO post JDBC日志记录到文件,然后我创建了下面的java程序并从我的eclipse IDE运行它,但是我看不到JDBC驱动程序类生成的任何日志。 我的OracleLog中有以下内容。属性文件: 但是当我通过将放在类路径中运行我的程序时,我会得到异常: 如果我在类路径中有ojdbc6\u

  • 问题内容: 我想将SQL语句记录在文件中。 我在以下属性 当我运行我的应用程序时 我可以在控制台中看到sql语句,但是它们未出现在文件app.log中。该文件仅包含来自spring的基本日志。 如何查看日志文件中的sql语句? 问题答案: 尝试在属性文件中使用它:

  • 问题内容: 我试图使用T-SQL的MERGE语句插入许多记录,但是当源表中有重复的记录时,我的查询无法插入。失败原因是: 目标表有一个基于两列的主键 源表可能包含重复记录,这些记录违反了目标表的主键约束(引发了“违反主键约束”) 我正在寻找一种方法来更改我的MERGE语句,以便它要么忽略源表中的重复记录,并且/或者将尝试/捕获INSERT语句以捕获可能发生的异常(即,所有其他INSERT语句都将运