この記事では、ロギングに関するPostSharpのMS Dynamics CRMへの適用性に関する私の調査結果についてお話したいと思います。
だから:
- MS Dynamics CRM 2013
- Nlog
- ポストシャープ
欲しいもの:ロギングが必要です(角質ですが、ロギング)。
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()で
================================================== =======