MS Dynamics CRMおよびPostSharp

挨拶、親愛なる読者



この記事では、ロギングに関するPostSharpのMS Dynamics CRMへの適用性に関する私の調査結果についてお話したいと思います。





だから:





欲しいもの:ロギングが必要です(角質ですが、ロギング)。



MS Dynamics CRMのプラグインにロギングを適用することにしました。



ロギングから、次のものが必要です:







まず、プラグイン用のプロジェクトを作成します。







NLogでnugetパッケージをダウンロードします。







PostSharp自体をピックアップすることを忘れないでください:







CRM SDKビルドも選択します。



ここで最も興味深いのは、ロガーの設定を保存する場所ですか?

率直に言って、私にとってこれは未解決の問題です。

3つのオプションだけが思い浮かびます。





これらのオプションにはそれぞれ欠点と利点があります。

私の意見では、最も成功したオプションはロガーの設定を持つエンティティですが、この場合、設定をキャッシュすることはあまり良い解決策ではないため、このエンティティを毎回取り出す必要があります(プラグインの実行には長時間かかることがありますが、その時点で設定を変更できます)



しかし、この場合、私のタスクはより慣れ親しんでいるので、さらに進んでいきました。



このような単純なプラグインを作成しましょう。



namespace LoggedPlugin { public class TestPlugin:IPlugin { [Logging] private string SimpleMethod(string input) { return "Hello CRM"; } [Logging] private void MethodThrowsException() { throw new NotImplementedException(); } public void Execute(IServiceProvider serviceProvider) { SimpleMethod("Hi CRM"); MethodThrowsException(); } } }
      
      







アスペクトには次のコードが含まれます。



 namespace LoggedPlugin.Logging { [Serializable] public class LoggingAttribute : OnMethodBoundaryAspect { public override void OnException(MethodExecutionArgs args) { Logger.Instance.Error(" ",args.Exception); } public override void OnEntry(MethodExecutionArgs args) { Logger.Instance.Trace(string.Format("{0}.{1}:  .", args.Method.DeclaringType.FullName, args.Method.Name)); var argumentInfos = args.Method.GetParameters(); for (var index = 0; index < args.Arguments.Count; index++) { var argument = args.Arguments[index]; Logger.Instance.Trace(string.Format("{0}:{1}", argumentInfos[index].Name, argument)); } } public override void OnSuccess(MethodExecutionArgs args) { Logger.Instance.Trace(string.Format("{0}.{1}:  .", args.Method.DeclaringType.FullName, args.Method.Name)); } } }
      
      







まあ、実際にはロガー:

 namespace LoggedPlugin.Logging { public sealed class Logger { private static volatile Logger _instance; private static readonly object _syncRoot = new object(); private readonly NLog.Logger _logger; private Logger() { var config = new LoggingConfiguration(); var fileTarget = new FileTarget(); config.AddTarget("file",fileTarget); fileTarget.FileName = @"C:\logs\log.txt"; fileTarget.Layout = @"${date:format=[HH\:mm\:ss.fff]} ${level:uppercase=true} t[${threadid}] ${message} ${exception:format=ToString}"; var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget); config.LoggingRules.Add(loggingRule); LogManager.Configuration = config; _logger = LogManager.GetLogger("FileLogger"); } public static Logger Instance { get { if (_instance == null) { lock (_syncRoot) { if (_instance == null) _instance = new Logger(); } } return _instance; } } public void Trace(string message) { _logger.Trace(message); } public void Error(string message, Exception e) { _logger.Error(message,e); } } }
      
      







このロガーにはハードコードがありますが、これ以上は必要ありません-アカデミック目的のために!



次に、ILMergeユーティリティを使用して、アセンブリに署名してビルドし、3つのアセンブリを保持します。

LoggedPlugin.dll、NLog.dll、PostSharp.dll。



次に、結果をCRMに公開します。







このプラグインを掛けてリードを作成しました。



リードを作成した後、私はこの結果を見ました:



================================================== =======

[22:46:51.816] TRACE t [31] LoggedPlugin.TestPlugin.SimpleMethod:メソッドが開始しました。

[22:46:51.863] TRACE t [31]入力:こんにちはCRM

[22:46:51.863] TRACE t [31] LoggedPlugin.TestPlugin.SimpleMethod:メソッドが完了しました。

[22:46:51.863] TRACE t [31] LoggedPlugin.TestPlugin.MethodThrowsException:メソッドが開始されました。

[22:46:51.863]エラーt [31] System.NotImplementedExceptionが失敗しました:メソッドまたは操作は実装されていません。

LoggedPlugin.TestPlugin.MethodThrowsException()で



================================================== =======



All Articles