带有自定义参数的AOP日志

本文关键字:AOP 日志 参数 自定义 | 更新日期: 2023-09-27 18:14:19

在每个方法执行之前,我想记录该方法的所有参数。为此,我将使用AOP(面向方面编程)并创建一个"Loggable"属性。但是…我还想知道我的参数的内容。对于字符串参数,这不是问题。但我想知道一个好的解决方案,每一个场合,如对象,int, double,…

是否有其他方法来解决这个问题,而不是覆盖ToString()方法?(在示例中,我总是遇到字符串参数…)

:

public class MyType {
    public int Id { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
}
[Loggable]
public void IDoWhateverIWant(MyType data, int count, string message){
    //Whatever I want
}
IDoWhateverIWant(
       new MyType(){
            Id = 1,
            Name = "My test data name",
            Value = 1234.56}
       , 5
       , "Log me, please");

Logmessage(这些参数的呈现方式对我来说是一样的,我只是想看看它们):

22/07/2014 9:30传入消息:IDoWhateverIWant,参数:
- data: Id = 1
Name = "我的测试数据名称"

- count: 5
-留言:"Log me, please"

带有自定义参数的AOP日志

一个简单的选择是使用NewtonSoft。Json来序列化每个参数。这个简单的例子:

public void IDoWhateverIWant(MyType data, int count, string message)
{
    string logMessage = 
        ParameterValueMessage(data, "data") + Environment.NewLine +
        ParameterValueMessage(count, "count") + Environment.NewLine +
        ParameterValueMessage(message, "message");
    Debug.Print(logMessage);
}
public static string ParameterValueMessage<T>(T arg, string name)
{
    string result = JsonConvert.SerializeObject(arg, Formatting.Indented);
    return name + ": " + result;    
}

生成以下内容:

data: {
  "Id": 1,
  "Name": "My test data name",
  "Value": 1234.56
}
count: 5
message: "Log me, please"

我个人的偏好是每个方法都接受一个参数对象——使用参数对象的日志代码更简洁,更通用,所有的单个参数名称都可以从参数对象中推断出来:

public class MyParameterObject
{
    public MyType data { get; set; }
    public int count { get; set; }
    public string message { get; set; }
}

,其序列化方式与

基本相同,并且不必传递每个单独参数的名称:

public void IAlsoDoWhateverIWant(MyParameterObject parameterObject)
{
    string logMessage = ParameterValueMessage(parameterObject);
    Debug.Print(logMessage);
}
public static string ParameterValueMessage<T>(T arg)
{
    return JsonConvert.SerializeObject(arg, Formatting.Indented);
}

并产生以下输出:

{
  "data": {
    "Id": 1,
    "Name": "My test data name",
    "Value": 1234.56
  },
  "count": 5,
  "message": "Log me, please"
}