3

私は、既存のソフトウェアに統合される監査ログ システムを作成しています。データベース構造には、ログに記録されるアクションに関する詳細の BLOB 用のフィールドが含まれています。派手なものである必要はありません。あまり必要ではありません。必要な場合は、ほとんどの場合、どのメソッドがどのパラメーターで呼び出されたかなどを調べるために、開発者によって読み取られます。これは、おそらく人間が判読できるはずですが、何かによって解析される必要がないことを意味します。したがって、多くのオーバーロードを使用したり、ひどいスイッチ ケースの文字列置換を使用したりするのではなく、詳細ブロブを記述する良い方法は、ログに記録されるアクションに必要なパラメーターの名前と値を取得するためのログ呼び出し用であると考えました。彼らに渡されたもの。いろいろ調べましたが、

これが私が求めているものの大まかなモックです:

Dictionary<string,string> parameters = new Dictionary<string,string>();
foreach (Parameter p in MethodCall)
{
    parameters.Add(p.Name, p.Value.ToString());
}

LogEvent(EventType.Something, userID = thisUser, details = parameters);

実際にはそれよりも複雑になる可能性が高いことは理解していますが、一般的な考え方はわかります。私の LogEvent メソッド内には、タイムスタンプを追加し、ユーザー側のログ ビューアー用に説明文を作成するためのいくつかの要素があります (プログラム/データベース構造を公開しないように、管理者や開発者に示すよりも技術的な詳細は少なくなります)。理論的には、ビルドします。パラメーターの詳細のディクショナリからのある種のブロブ (おそらく JSON など)。

4

4 に答える 4

1

ロギングメソッドが式パラメーターを受け取る場合、次のコードでパラメーター名と値を取得できます。

static void LogSomething(Expression<Action> expression)
{
    var methodCallExpression = ((MethodCallExpression) expression.Body);
    var parameterNames = methodCallExpression.Method.GetParameters().Select(p => p.Name);
    var values = methodCallExpression.Arguments.Select(a => a.Value);
}
于 2012-11-06T13:27:31.913 に答える
1

関連: .NET のスタック フレームからパラメーター値を取得しますか? これにはいくつかの有用な答えがあります。

メソッド名とパラメーター リストをログに記録します。メソッド名は StackFrame を使用すると簡単ですが、単純なリフレクションを使用してパラメーター値を取得することはできないと思います。

于 2012-11-06T13:14:11.283 に答える
1

以下の例のように、Interceptor (Castle.DynamicProxy) を使用します。

  internal class Program
  {
    private static void Main(string[] args)
    {

      var interceptor = new Interceptor();
      var businessObjectClass = new ProxyGenerator().CreateInterfaceProxyWithoutTarget<IBusinessObjectClass>(interceptor);

      businessObjectClass.Method3("what",123);

      Console.ReadLine();
    }
  }

  public class Interceptor : IInterceptor
  {
    #region IInterceptor Members

    public void Intercept(IInvocation invocation)
    {
      Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));
      foreach (var argument in invocation.Arguments)
      {
        Console.WriteLine(string.Format("\t Param: " + argument.ToString()));
      }
      invocation.Proceed();
    }

    #endregion
  }

  public interface IBusinessObjectClass
  {
    void Method3(string stringValue, int intValue);
  }

  public class BusinessObjectClass : IBusinessObjectClass
  {

     public void Method3(string stringValue, int intValue)
    {
      return;
     }

  }

動的プロキシ

于 2012-11-06T14:32:03.997 に答える
0

PostSharpを試してみませんか? あなたのような問題を解決するためのものです。サンプルには、パラメーター値を出力するロギングアスペクトがあります。XML 構成と組み合わせると、管理者/ユーザーは自由にロギング/トレースを有効にできます。

于 2012-11-09T22:18:51.597 に答える