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

11.11.21

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

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

Скачать файлы

Наименование Файл Версия Размер
Подсистема сквозного логирования на клиенте и сервере в разные приемники. Расширение
.cfe 33,67Kb
6
.cfe 2.2.1 33,67Kb 6 Скачать
Подсистема сквозного логирования на клиенте и сервере в разные приемники. Конфиуграция
.cf 34,01Kb
6
.cf 2.2.1 34,01Kb 6 Скачать

Зачем

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

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

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

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

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

 

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

Для поставки в виде расширения режим совместимости конфигурации должен быть  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. Можно пользоваться

 

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

 

//Контекст - Клиент

лЛог.НовыйЛог();
лЛог.ДобавитьСпособЛогированияБаза();

лЛог.Инф_("Мой первый лог"); //Логируется только в базу

лЛог.ДобавитьСпособЛогированияФайл("D:\МойЛог.txt");

лЛог.Инф_("Мой второй лог"); //Логируется в базу и в файл

лЛог.ДобавитьСпособЛогированияФайл("D:\ЛогТолькоНаКлиенте.txt",,"Сервер");

лЛог.Инф_("Мой третий лог лог"); //Логируется в базу и в первый файл

//Контекст - Сервер
лЛог.Инф_("Мой четвертый лог лог"); //Логируется в базу и в оба файла


//Контекст - Клиент
лЛог.Отключить(); //Логирование прекращается

лЛог.Инф_("Мой пятый лог"); //ничего не залогируется

лЛог.Включить(); //Заново включаем

лЛог.Инф_("Мой шестой лог"); //Логируется в базу и в первый файл

лЛог.ЗавершитьЛогирование(); //Прекращаем логировать в лог по умолчанию.

 

 

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

 

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

См. также

LogManager - Внешний журнал регистрации в SQL

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Журнал регистрации платформы 1С в SQL. Общая база хранения всех журналов. Через com-подключение регламентным заданием периодически догружает журналы регистраций из рабочих баз. Предоставляет настраиваемый доступ к журналам по правам подразделений. Формирует отчеты по пользователям и данным.

10000 руб.

23.05.2014    54958    50    16    

43

Версионирование справочников, документов и регистров сведений на SQL-сервере

Журнал регистрации Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

19200 руб.

22.02.2018    34657    60    53    

54

Мониторинг баз и серверов 1С

Журнал регистрации Мониторинг Платформа 1С v8.3 Платные (руб)

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

9000 руб.

28.08.2019    29604    11    21    

59

LogiCH - хранение и анализ журнала регистрации в сверхбыстрой СУБД ClickHouse

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

5000 руб.

28.11.2018    19231    12    6    

35

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

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

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

1 стартмани

13.11.2023    1767    2    AlexSTAL    0    

33

Мониторинг состояния с отправкой в telegram

Журнал регистрации Инструменты администратора БД Мониторинг Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Абонемент ($m)

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

3 стартмани

26.09.2023    1166    5    doom2good    10    

11

История фоновых заданий

Журнал регистрации Статистика базы данных HighLoad оптимизация Конфигурации 1cv8 Абонемент ($m)

Удобный отчет по выполнению фоновых заданий в 1С с разбивкой по разным критериям, например по срокам, в какой последовательности, выполнение дольше всех, сколько одновременно и так далее.

5 стартмани

04.09.2023    422    5    Maxiko    0    

7

Перенаправление вывода журнала регистрации

Linux Журнал регистрации Платформа 1С v8.3 Бесплатно (free)

Экспериментируем с реализацией драйвера текстового устройства под Linux для перенаправления вывода журнала регистрации.

07.08.2023    977    Lars Ulrich    1    

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


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

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


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

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


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

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

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

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

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

насчет логов в HTTP и конкатенацию полностью согласен
9. leemuar 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 499 20.06.23 21:28 Сейчас в теме
(17) ты ошибся, дружище
длина твоего инструмента инвариантна в системах
(сразу скажу, что у тебя длиньше)
rabid_otter; +1 Ответить
14. SpaceOfMyHead 177 01.05.22 23:35 Сейчас в теме
(7) Переиспользование HTTPСоединение не помогало увеличить скорость последовательных HTTP-запросов?
rabid_otter; +1 Ответить
15. rabid_otter 134 02.05.22 11:43 Сейчас в теме
(14) нет, 1Сина сама по себе тормознутая.
10. leemuar 26.11.21 11:38 Сейчас в теме
@artbear ты когда-то хотел такое
12. eufes 28.11.21 11:44 Сейчас в теме
Доброго дня. А эта подсистема предусматривает корректную запись логов если ошибка произошла в транзакции?
13. cprit 852 28.11.21 11:47 Сейчас в теме
(12) Смотря куда пишете. Если в базу - такой защиты не делали. Все остальные способы логирования работают независимо от транзакции. Идею записал.
Оставьте свое сообщение