LogosFor1C. Подсистема сквозного логирования на клиенте и сервере в разные приемники

06.12.23

База данных - Журнал регистрации

Позволяет задать несколько настроек логирования и использовать изолированно друг от друга. При этом настройки не нужно хранить в переменной. Eсть возможность добавления своих способов логирования. Распространяется в виде расширения и конфигурации.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Подсистема сквозного логирования на клиенте и сервере в разные приемники. Расширение
.cfe 33,54Kb ver:2.3.1
7
7 Скачать (1 SM) Купить за 1 850 руб.
Подсистема сквозного логирования на клиенте и сервере в разные приемники. Конфиуграция
.cf 34,22Kb ver:2.3.1
7
7 Скачать (1 SM) Купить за 1 850 руб.

Зачем

Бывают ситуации, когда нет возможности отладить код. Зачастую вообще нет доступа до базы, в которой требуется отладка. Соответственно, понять, в чем же проблема, и тем более ее устранить получается не всегда.  

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

Во-первых, хотелось отказаться от передачи переменной или обработки во все участки кода, где требуется запись лога. Вместо этого один раз проинициализировать логирование и затем обращаться к нему из любого метода и контекста. Например, для записи информации об ошибке достаточно написать лЛог.От_("Мое сообщение"). Причем, если сделать небольшую адаптацию под конкретную базу, можно вызывать логирование без предварительной инициализации.

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

В-третьих, заложить в решение возможность адаптации под конкретные условия. Например, добавление своего способа логирования (отправка на сторонний сервис, мессенджер и т.п.).

 

Совместимость

Для поставки в виде расширения режим совместимости конфигурации должен быть  8.3.12 и выше. 

Для поставки в виде конфигурации должно работать и с более ранними режимами совместимости. Но это не проверялось 

Ограничений по операционной системе не нашел. 

Тестировалось на платформах 8.3.14.2095, 8.3.17.1851

 

Общий концепт

В системе задается несколько настроек логов. Вся работа с логами идет в разрезе настроек логов.

Для каждой настройки логов задается уровень срабатывания записи и способы записи логов(способы логирования), шаблон сообщения и другие настройки. У каждой настройки логирования одновременно могут быть несколько способов логирования.

Имя настройки лога можно не указывать  в методах. В этом случае используется имя по умолчанию "logFor1C"

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

 

Инициализация

  1. Инициализация с настройками по умолчанию
лЛог.НовыйЛог();
  1. Инициализация по наименованию настройки
лЛог.НовыйЛог(Наименование);

Далее все логирование должно идти с указанием имени лога

 

Особенности изменения настроек лога на сервере

Ввиду технологических ограничений (отсутствия единого хранилища для клиента и сервера), пришлось реализовать отдельные хранилища для клиента и сервера. При создании/настройке лога на клиенте, настройки автоматически обновляются на сервере.

При инициализации лога или изменении его настроек на сервере, после завершения серверного вызова нужно на клиенте вызвать метод

лЛог.ОбновитьЛогиНаКлиентеПоДаннымСервера();

 

Уровни логирования и основные методы

В подсистеме используется следующие (по возрастанию приоритета):

  1. НЕТ - Логирование не происходит
  2. ОТЛАДКА
  3. ИНФОРМАЦИЯ
  4. ПРЕДУПРЕЖДЕНИЕ
  5. ОШИБКА
  6. КРИТИЧЕСКАЯОШИБКА

По умолчанию используется уровень логирования ИНФОРМАЦИЯ. При установке какого-либо уровня, в лог будут выводиться только сообщения этого уровня и уровней с большим приоритетом. Уровень логирования задается для каждого инициализированного лога отдельно.

Например, если установлен уровень ПРЕДУПРЕЖДЕНИЕ то будут выводиться сообщения следующих уровней: ПРЕДУПРЕЖДЕНИЕ, ОШИБКА, КРИТИЧЕСКАЯОШИБКА.

Уровень логирования можно изменить с помощью метода УстановитьУровеньЛогирования():

лЛог.УстановитьУровеньЛогирования("Ошибка");
лЛог.УстановитьУровеньЛогирования("Ошибка", "НеОсновнойЛог");

 

Вывод сообщений в лог

Каждому уровню логирования соответствует свой метод вывода информации:

лЛог.Отл_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Пред_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Инф_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Ош_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Крит_("Отладочное сообщение", ИмяЛога = Неопределено);

Так же есть длинные варианты тех же методов

лЛог.Отладка_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Информация_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Предупреждение_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.Ошибка_("Отладочное сообщение", ИмяЛога = Неопределено);
лЛог.КритическаяОшибка_("Отладочное сообщение", ИмяЛога = Неопределено);

Если лог с указанным именем не был инициализирован, то логирование не выполнится

 

Шаблон сообщения

Для лога можно задать свой шаблон сообщения. В шаблонах поддерживаются следующие псевдонимы:

  • %УРОВЕНЬ% - уровень лога которым было сформировано сообщение (например: ИНФОРМАЦИЯ).
  • %СОБЫТИЕ% - указанное событие логирования (имя лога).
  • %СООБЩЕНИЕ% - текст выводимого сообщения.
  • %ДАТА% - дата и время в формате yyyy.MM.dd HH:mm:ss (например: 2020.09.16 23:52:49).
  • %ДАТАМС% - количество миллисекунд текущей даты.
  • %УНИВЕРСАЛЬНАЯДАТАМС% - универсальная дата полученная с помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах().

По-умолчанию используется шаблон %ДАТА% - %УРОВЕНЬ% - %СООБЩЕНИЕ%

ВАЖНО: псевдонимы регистрозависмые и допускается их указание только в верхнем регистре.

Пример шаблона:

лЛог.УстановитьШаблонСообщения("%ДАТА%.%ДАТАМС%/ %УНИВЕРСАЛЬНАЯДАТАМС% /%СООБЩЕНИЕ% | %СОБЫТИЕ% | %УРОВЕНЬ% |");
лЛог.Пред_("Привет. Это первый лог в базе");

Вывод:

2021.11.01 18:35:32.830/ 63771377732830 /Привет. Это первый лог в базе | Логирование | ПРЕДУПРЕЖДЕНИЕ |

 

Способы логирования

Поддерживаются следующие способы:

  • Консоль - вывод в стандартные сообщения
  • ЖурналРегистрации
  • Память - работает только в контексте клиента
  • База - запись в специальный регистр сведений. 
  • Файл - Логирование производится в указанный файл. Каталог файла должен быть ранее создан. У одной настройки логов может быть несколько
  • КаталогФайлов - для логирования указывается каталог и шаблон имени файла. Файлы в данном случае генерятся автоматически. Каталог должен быть ранее создан. У одной настройки логов может быть несколько

 

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

 

Общий формат добавления способа логирования к логу

лЛог.ДобавитьСпособЛогирования(Способ, Параметры, ЛогИлиИмяЛога = Неопределено, Контекст = "");

У способа логирования могут быть параметры, которые необходимо указать при добавлении.

Параметры способа логирования можно получить методом:

лЛог.ПараметрыСпособаЛогирования(Способ);

 

Для типовых способов логирования предусмотрены специфичные методы добавления в лог

лЛог.ДобавитьСпособЛогированияКонсоль(ЛогИлиИмяЛога = Неопределено, Контекст = "");
лЛог.ДобавитьСпособЛогированияБаза(ЛогИлиИмяЛога = Неопределено, Контекст = "");
лЛог.ДобавитьСпособЛогированияЖурналРегистрации(ЛогИлиИмяЛога = Неопределено, Контекст = "");
лЛог.ДобавитьСпособЛогированияПамять(ЛогИлиИмяЛога = Неопределено, Контекст = "");
лЛог.ДобавитьСпособЛогированияФайл(ИмяФайла, ЛогИлиИмяЛога = Неопределено, Контекст = "");
лЛог.ДобавитьСпособЛогированияКаталогФайлов(Каталог, ШаблонИмениФайла = "", ЛогИлиИмяЛога = Неопределено, Контекст = "");

 

Контекст для способа логирования

Для каждого способа логирования можно указать контекст, в котором данный способ будет срабатывать. Сейчас доступно:

  • Клиент - Логирование для способа происходит только на клиенте
  • Сервер - Логирование для способа происходит только на сервере
  • КлиентСервер или пустой контекст - фильтр по контексту не применяется

Например,

лЛог.ДобавитьСпособЛогированияКонсоль(, "Клиент"); //ЛОгирование для лога по умолчанию в консоль будет выполняться только на клиенте
лЛог.ДобавитьСпособЛогированияБаза(, "Сервер"); //Логирование для лога по умолчанию в базу будет тол

 

Шаблон наименования файла для логирования в каталог

По умолчанию равен [ИМЯЛОГА].txt.

Поддерживаются следующие параметры:

  • [ИМЯЛОГА] - Имя текущего лога
  • [ДАТА] - Текущая дата в формате dd.MM.yyyy
  • [ДЕНЬ] - номер текущего дня месяца
  • [ДЕНЬНЕДЕЛИ] - Номер текущего дня недели
  • [МЕСЯЦ] - Номер текущего месяца
  • [ГОД] - Текущий год
  • [НОМЕРСЕАНСА] - Номер текущего сеанса пользователя
  • [ПОЛЬЗОВАТЕЛЬ] - Имя текущего пользователя системы

 

Добавление своих способов логирования

Есть возможность определять свои способы логирования. Для этого предоставляются два варианта. Использование добавленных способов идет по общей схеме.

ПараметрыСпособа = лЛог.ПараметрыСпособаЛогирования("Мой");
ПараметрыСпособа.Суффикс = "Привет";
	
лЛог.ДобавитьСпособЛогирования("Мой", ПараметрыСпособа);

 

Добавление способа логирования через переопределяемый модуль

Нужно в общем модуле лЛогПереопределяемый доработать методы

  • ПриОпределенииСпособовЛогирования - для добавления вашего способа в список Например,
МойСпособ = лЛогСлужебный.НовыйСпособЛогирования("Мой");
	
Способы.Вставить(МойСпособ.Имя, МойСпособ);
  • ПриОпределенииПараметровСпособаЛогирования - для определения параметров, необходимых вашему способу(Необязательно) Например,
Если ИмяСпособа = "Мой" Тогда
	ПараметрыСпособа = Новый Структура;
	ПараметрыСпособа.Вставить("Суффикс", "");
КонецЕсли;

 

  • ПриВыводеСообщенияВЛогПоСпособу - здесь нужно добавить алгоритм записи лога по вашему способу

Например,

Если ИмяСпособа = "Мой" Тогда
	Сообщить(Сообщение+Параметры.Суффикс);
КонецЕсли;

 

Добавление способа логирования через новый общий модуль

Нужно добавить новый общий модуль в конфигурацию/расширение/новое расширение с префиксом лЛогСпособЛогирования. Пример добавления способа логирования через общий модуль приведен тут

Префикс можно переопределить в процедуре ПриОпределенииПрефиксаОбщихМодулейОпределяющихСпособыЛогирования общего модуля лЛогПереопределяемый

Имя нового способа логирования получается из имени модуля путем отсечения префикса.

Например, модуль с именем лЛогСпособЛогированияОповещениеПользователя добавляет способ логирования с именем "ОповещениеПользователя". Также имя можно задать непосредственно в модуле определив функцию Имя()

В модуле должны быть определены следующие методы

//необязательна. Показывает необхоодимость серверного контекста для выполнения записи. По умолчанию Ложь
Функция ЗаписьТолькоНаСервере() Экспорт
	Возврат Ложь;	
КонецФункции

//Необязательна. Указывает на невозможность добавления способа два раза в один лог. По умолчанию Истина
Функция ЗапретДублейУЛога() Экспорт
	Возврат Истина;
КонецФункции

//Необязательна. Позволяет переопределить имя, получаемое из имени модуля
Функция Имя() Экспорт
	Возврат "МоеИмя";
КонецФункции

//Необязательна. Определяет параметры, необходимые для способа логировнаия. По умолчанию Неопределено
Функция НовыйПараметрыСпособаЛогирования() Экспорт
	ПараметрыСпособа = Новый Структура;
	ПараметрыСпособа.Вставить("Префикс","");
	Возврат ПараметрыСпособа;	
КонецФункции

//Обязательна. Выполняет запись лога по вашему алгоритму
Процедура ЗаписатьСообщениеВЛог(Сообщение, Лог, УровеньЛогирования, Параметры) Экспорт
	СообщениеДляЗаписи = Параметры.Префикс  + Сообщение;
	лЛогСлужебныйСервер.ЗаписатьСообщениеЛогаВБазу(Лог, СообщениеДляЗаписи, УровеньЛогирования);
КонецПроцедуры

 

Управление логированием

  • Отключение логирования для лога. В этом случае логирование по данному логу прекращается, но все настройки сохраняются
лЛог.Отключить(ЛогИлиИмяЛога = Неопределено);
  • Включение логирования для лога после отключения.
лЛог.Включить(ЛогИлиИмяЛога = Неопределено);

Это может быть удобным, если требуется отключить логи на определенном участке кода.

  • Завершение логирования для лога. Удаление настройки лога из актуальных
лЛог.ЗавершитьЛогирование(ЛогИлиИмяЛога = Неопределено);
  • Получения текущих настроек логов
лЛог.АктивныеЛоги();
  • Удаление всех настроек логов. Остановка всего логирования
лЛог.ОчиститьСписокЛогов();
  • Получение данных лога для способа логирования Память
лЛог.ДанныеЛога(ЛогИлиИмяЛога = Неопределено);

 

Интеграция в стороннее решение

Есть возможность простой интеграции в стороннее решение с переименованием модулей и объектов подсистемы. Для этого нужно:

  1. Перенести объекты подсистемы в ваше решение
  2. Переименовать объекты подсистемы на ваши имена
  3. В модулях найти область с именем ПереопределениеМодулейПодсистемы и во вложенных процедурах указать новые имена модулей и объектов
  4. В модулях приложения, внешнего соединения и сеанса изменить вызов общих модулей на ваши.
  5. Можно пользоваться

 

 
 Пример использования

 

Другие решения

Обновления

 
 2.3.1
  • Понижен режим совместимости расширения до 8.3.12
  • Хранение параметров логов на сервере переведено на использование модуля повторного использования. Удалено использование параметров сеанса
 
 2.3.0

 

Логорование подсистема

См. также

Журнал регистрации Системный администратор Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

История изменений реквизитов и табличных частей справочников, документов, независимых регистров сведений, возможность отката изменения, восстановление удаленных объектов, сбор статистики использования базы 1С. Альтернативный журнал регистрации.

22800 руб.

22.02.2018    35959    59    54    

57

Журнал регистрации Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

6000 руб.

28.11.2018    21334    18    7    

44

Журнал регистрации Программист Россия Бесплатно (free)

В материале рассматривается сравнение двух инструментов для работы с журналом регистрации 1С: утилиты ibcmd и платформы Vector. Описаны их функциональные возможности, тестирование производительности и практическое применение для преобразования логов в формат JSON.

20.11.2024    1959    user1913000    13    

20

Журнал регистрации Тестирование QA Программист Бесплатно (free)

Поговорим про логирование в приложениях на базе 1С, рассмотрим проблемы, которые возникают при сборе информации из этих систем, и обсудим практический опыт применения внутренних и внешних инструментов для анализа логов.

21.10.2024    4011    leemuar    8    

24

Инструменты администратора БД Журнал регистрации Системный администратор Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Внешняя обработка для регламентного сокращения журнала регистрации для конфигураций на базе БСП и платформы 8.3.20+

1 стартмани

29.12.2023    2642    43    dima_gsv    3    

14

Журнал регистрации Мониторинг Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    1839    6    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    5648    11    AlexSTAL    0    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1330 11.11.21 03:46 Сейчас в теме
К разделу "Другие решения", https://infostart.ru/public/671835/, сделано на адаптерах, сам не осилил, попробую применить ваше решение.
"База - запись в специальный регистр сведений. " - вызывать НаСервереБезКонтекста? В принципе рабочий вариант с потоковым чтением из SQL.
В качестве тестов можно завернуть лог РМК Розницы в вашу подсистему.
2. cprit 903 11.11.21 09:42 Сейчас в теме
(1)
К разделу "Другие решения", https://infostart.ru/public/671835/


Добавил ссылки на проект

"База - запись в специальный регистр сведений. " - вызывать НаСервереБезКонтекста? В принципе рабочий вариант с потоковым чтением из SQL.


Можно вызывать из любого контекста. При необходимости клиент серверный вызов будет произведен сам.

В качестве тестов можно завернуть лог РМК Розницы в вашу подсистему.


Это будет круто. Если будет не сложно черканите, что выявите (ошибки и предложения) в результате тестов
3. malikov_pro 1330 11.11.21 10:40 Сейчас в теме
"Можно вызывать из любого контекста." - гонять форму с клиента на сервер и обратно ради одной строчки лога очень затратно.
По результатам тестов статью напишу, вроде описания функционала на IS не было.
4. cprit 903 11.11.21 10:42 Сейчас в теме
(3) Думаю, что форма гоняться и не будет. Клиент-серверный вызов делается в общем модуле.
И да. Логировать в базу или журнал регистрации на клиенте нужно аккуратно. Может быть накладно
5. quazare 3883 12.11.21 09:44 Сейчас в теме
Здравствуйте! сам буквально вчера предложил статью по работе с журналом регистраций через БСП

https://infostart.ru/1c/articles/1548219/

здесь можно логировать и клиентом и сервером, так же описан практический способ пакетного логирования, чтобы не грузить постоянно.

вам плюс за труды.
6. cprit 903 12.11.21 09:58 Сейчас в теме
7. rabid_otter 134 13.11.21 11:03 Сейчас в теме
неплохо. когда я делал свое логирование в самописочке, у нас случилась беда откуда не ждали - 1С медленнее (в 4 раза по сравнению другим интерпретируемым ЯП) делает отправку в сторонний HTTP endpoint. метрики упали, у бизнеса появились вопросы, мол а с {censored} ли стало медленнее?
пришлось прикручивать лог в текстовые файлы через ЗаписьТекста, т. к. логов было очень много.
так что, подобные решения норм, когда логи пишутся нечасто.
все нормальные пацаны из других отделов писали логи в кафку, а мы в файлики.
из-за подобных подлянок со стороны вендора совсем ушел из 1С.

PS: и внимательнее с конкатенацией строк, СтрСоединить или СтрШаблон - наше все.
SpaceOfMyHead; +1 Ответить
8. cprit 903 13.11.21 11:14 Сейчас в теме
(7) Тут можно в файлы спокойно писать тоже. Не обязательно делать это в базу или еще куда-то. Запись файлов идет через объект "ЗаписьДанных".

насчет логов в HTTP и конкатенацию полностью согласен
9. leemuar 23 26.11.21 11:38 Сейчас в теме
(7) это не только проблема 1С. Вы все сделали правильно. Большое количество синхронных обращений по сети к сторонним сервисам замедляют работу программы. Логировать локально, а затем асинхронно логи передавать дальше - нормальная практика в высоконагруженных проектах
user1346935; +1 Ответить
11. rabid_otter 134 26.11.21 16:24 Сейчас в теме
(9) да, я правильно сделал, что ушел из 1С :)
16. user1346935 21.06.22 16:22 Сейчас в теме
(11)одним нищим неучем в 1С меньше )
17. rabid_otter 134 21.06.22 16:51 Сейчас в теме
(16) прокукарекал неудачник с длинным номером :)
18. tango 546 20.06.23 21:28 Сейчас в теме
(17) ты ошибся, дружище
длина твоего инструмента инвариантна в системах
(сразу скажу, что у тебя длиньше)
rabid_otter; +1 Ответить
14. SpaceOfMyHead 198 01.05.22 23:35 Сейчас в теме
(7) Переиспользование HTTPСоединение не помогало увеличить скорость последовательных HTTP-запросов?
rabid_otter; +1 Ответить
15. rabid_otter 134 02.05.22 11:43 Сейчас в теме
(14) нет, 1Сина сама по себе тормознутая.
10. leemuar 23 26.11.21 11:38 Сейчас в теме
@artbear ты когда-то хотел такое
12. eufes 28.11.21 11:44 Сейчас в теме
Доброго дня. А эта подсистема предусматривает корректную запись логов если ошибка произошла в транзакции?
13. cprit 903 28.11.21 11:47 Сейчас в теме
(12) Смотря куда пишете. Если в базу - такой защиты не делали. Все остальные способы логирования работают независимо от транзакции. Идею записал.
Оставьте свое сообщение