Приветствую, Уважаемые Хаброчитатели
В данной статье хочу поведать о результатах моих исследований относительно применимости PostSharp к MS Dynamics CRM в плане логирования.
Итак, имеется:
Что хочу: логирование хочу (банально, но именно логирование).
Решил, что буду пробовать применить логирование к плагину для MS Dynamics CRM.
От логирования хочу следующее:
Для начала создадим проект для нашего плагина:
Подгрузим nuget-пакет с NLog:
Не забываем подцепить собственно PostSharp:
Также подцепляем сборки CRM SDK.
Теперь самое интересное: где хранить настройки логера?
Признаюсь честно, для меня это поныне открытый вопрос.
На ум приходят всего три варианта:
У каждого из этих вариантов есть свои недостатки и положительные стороны.
На мой взгляд, наиболее удачный вариант — сущность с настройками логера, но в этом случае придется всякий раз вытаскивать эту сущность, так как кеширование настроек — не совсем удачное решение (плагин может долго исполняться, а я могу в этот момент поменять настройки).
Но в данном случае задача у меня больше ознакомительная, поэтому поехали дальше.
Напишем вот такой простенький плагинчик:
Аспект у нас будет иметь следующий код:
Ну и собственно логер:
Логер такой с хардкодом, но большего и не надо — для академических целей!
Дальше мы подписываем сборку, билдим ее и мержим три сборки при помощи утилиты ILMerge:
LoggedPlugin.dll,NLog.dll и PostSharp.dll.
После чего публикуем результат в CRM:
Я повесил данный плагин на создание лида.
После создания лида, я увидел вот такой результат:
=========================================================
[22:46:51.816] TRACE t[31] LoggedPlugin.TestPlugin.SimpleMethod: Начат метод.
[22:46:51.863] TRACE t[31] input:Hi 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] ERROR t[31] Произошел сбой System.NotImplementedException: The method or operation is not implemented.
at LoggedPlugin.TestPlugin.MethodThrowsException()
=========================================================
В данной статье хочу поведать о результатах моих исследований относительно применимости PostSharp к MS Dynamics CRM в плане логирования.
Итак, имеется:
- MS Dynamics CRM 2013
- NLog
- PostSharp
Что хочу: логирование хочу (банально, но именно логирование).
Решил, что буду пробовать применить логирование к плагину для MS Dynamics CRM.
От логирования хочу следующее:
- Логировать метод, который был вызван
- Логировать входные аргументы
- Логировать, когда метод был завершен
- Логировать исключения
Для начала создадим проект для нашего плагина:
Подгрузим nuget-пакет с NLog:
Не забываем подцепить собственно PostSharp:
Также подцепляем сборки CRM SDK.
Теперь самое интересное: где хранить настройки логера?
Признаюсь честно, для меня это поныне открытый вопрос.
На ум приходят всего три варианта:
- Хардкод — плохой вариант
- В случае плагинов — в конфигурации плагина
- Создать сущность для хранения настроек
У каждого из этих вариантов есть свои недостатки и положительные стороны.
На мой взгляд, наиболее удачный вариант — сущность с настройками логера, но в этом случае придется всякий раз вытаскивать эту сущность, так как кеширование настроек — не совсем удачное решение (плагин может долго исполняться, а я могу в этот момент поменять настройки).
Но в данном случае задача у меня больше ознакомительная, поэтому поехали дальше.
Напишем вот такой простенький плагинчик:
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:
LoggedPlugin.dll,NLog.dll и PostSharp.dll.
После чего публикуем результат в CRM:
Я повесил данный плагин на создание лида.
После создания лида, я увидел вот такой результат:
=========================================================
[22:46:51.816] TRACE t[31] LoggedPlugin.TestPlugin.SimpleMethod: Начат метод.
[22:46:51.863] TRACE t[31] input:Hi 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] ERROR t[31] Произошел сбой System.NotImplementedException: The method or operation is not implemented.
at LoggedPlugin.TestPlugin.MethodThrowsException()
=========================================================