...

Использование логгера для отладки сценариев.

Тема в разделе "Записки технической поддержки", создана пользователем veis, 28 дек 2022.

  1. veis

    veis Administrator

    В системе ELMA предусмотрена возможность логирования сообщений с помощью логгера log4net. Это может оказаться полезным в случае, когда требуется детальная отладка скриптов, например просмотр того, как изменялась конкретная переменная в ходе выполнения кода и таким образом лучше понимать что приводит к возникновению ошибки или неправильной работы системы.

    Конфигурационный файл логгера находится по пути:

    {elma_directory}\Web\Config\log4net.config



    В конфигурационном файле описываются две сущности: appender и logger, а также их взаимосвязи.

    Appender главным образом описывает куда будут записываться лог-файлы и их формат.

    Logger определяет уровень логирования (например Debug, Error, Info) и appenderы, к которым он будет обращаться.

    По умолчанию Elma уже содержит в себе настроенный конфигурационный файл, поэтому нам необходимо просто знать куда по умолчанию он будет записывать информацию и как им пользоваться. Допустим у нас есть следующий код:

    public virtual void VnesenieDannyhVTablicuVsehNesootvetstviy (Context context)
    {
    var parentInstance = context.WorkflowInstance.ParentInstance;
    if (parentInstance != null)
    {

    dynamic parentContext = parentInstance.Context;
    context.DoneFlag = "Ok";
    var i = 0;
    foreach (var element in context.Nesootvetstviya)
    {
    var item = CreateParentItem (parentContext.TablicaVsehNesootvetstviy);
    item.NomerNesootvetstviya = ++i;
    item._1ProveryaemoePodrazdelenie = element._1ProveryaemoePodrazdelenie;
    item.DataNesootvetstviya = element.DataNesootvetstviya;
    item.StandartNDSUkazaniemPunkta = element.StandartNDSUkazaniemPunkta;
    item.OpisanieNesootvetstviya = element.OpisanieNesootvetstviya;
    item.Nomer = i;
    }
    }

    }

    И допустим на каком-то из элементов из context.Nesootvetstviya процесс падает, но мы не знаем точно на каком и почему. В этом случае мы можем использовать логер.

    Для этого нужно:

    1. Добавить сборку log4net из сборок elma.
    2. Добавить пространство имён using log4net; в начале кода.
    3. (как вариант) Получить экземпляр логера по имени var logger = log4net.LogManager.GetLogger("Scripts"); , где Scripts - это имя логера.
    Например:

    public virtual void VnesenieDannyhVTablicuVsehNesootvetstviy (Context context)
    {
    var logger = log4net.LogManager.GetLogger("Scripts");
    logger.Debug("Enter VnesenieDannyhVTablicuVsehNesootvetstviy");

    var parentInstance = context.WorkflowInstance.ParentInstance;
    if (parentInstance != null)
    {

    dynamic parentContext = parentInstance.Context;
    context.DoneFlag = "Ok";
    var i = 0;
    foreach (var element in context.Nesootvetstviya)
    {
    var item = CreateParentItem (parentContext.TablicaVsehNesootvetstviy);
    item.NomerNesootvetstviya = ++i;
    logger.Debug(String.Format("i = ", i));
    item._1ProveryaemoePodrazdelenie = element._1ProveryaemoePodrazdelenie;
    logger.Debug(String.Format("_1ProveryaemoePodrazdelenie = ", element._1ProveryaemoePodrazdelenie.ToString()));

    item.DataNesootvetstviya = element.DataNesootvetstviya;
    logger.Debug(String.Format("DataNesootvetstviya = ", element.DataNesootvetstviya.ToString()));

    item.StandartNDSUkazaniemPunkta = element.StandartNDSUkazaniemPunkta;
    logger.Debug(String.Format("StandartNDSUkazaniemPunkta = ", element.StandartNDSUkazaniemPunkta.ToString()));

    item.Nomer = i;
    }
    }

    }

    С этим кодом записи сделанные методом logger.Debug будут записаны в файл, который указан в appender у логгера Scripts. Если используется конфигурационный файл по умолчанию, то это будет файл по пути

    {elma_directory}\Web\Logs\scripts

    Также нужно обратить внимание, чтобы уровень логирования у логера (level value) включал в себя уровень логирования, используемый в коде. В случае с примерами, мы использовали логирование уровня Debug, а в логгере конфигурационного файла указано:

    <logger name="Scripts" additivity="false">
    <level value="All"/>
    <appender-ref ref="Scripts" />
    </logger>

    Уровень логирования All подразумевает, что любой уровень логирования будет принят appenderом Scripts.
     

Поделиться: