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()で

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

Source: https://habr.com/ru/post/J251491/


All Articles