AOP使用自定义参数进行日志记录

时间:2014-07-22 07:38:44

标签: c# logging parameters aop

在每个方法执行之前,我想记录该方法的所有参数。为此,我将使用AOP(面向方面​​编程)并创建“Loggable”属性。但是......我也想知道我的参数内容。对于字符串参数,这不是问题。但我想知道每个场合都有一个很好的解决方案,比如对象,整体,双打,......

有没有其他方法可以解决此问题,然后覆盖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:
                                                   - 数据:Id = 1
                                                         Name =“我的测试数据名称”
                                                         值= 1234.56
                                                 - 数:5
                                                 - 留言:“请记录我”

1 个答案:

答案 0 :(得分:2)

一个简单的选择是使用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"

我自己的偏好是每个方法都采用单个parameter object - 日志代码更整洁,更通用的参数对象,所有单个参数名称都可以从参数对象中推断出来: / p>

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"
}