При регулярном создании тестовых контуров и развертывании копий рабочих информационных баз для разработки, тестирования или аналитики часто возникает задача минимизации накладных расходов на серверную инфраструктуру. Одной из наиболее ресурсоемких подсистем платформы является журнал регистрации (ЖР). В тестовых базах протоколирование действий пользователей и регламентных заданий зачастую не требуется, а интенсивная запись на диск лишь замедляет выполнение тестов и расходует дисковое пространство. Разберем, как правильно отключить ведение журнала регистрации штатными средствами 1С и почему для этого не подходят прямые манипуляции с СУБД.
Среди разработчиков и системных администраторов нередко возникает идея выполнить отключение или очистку журнала регистрации с помощью прямого SQL-запроса к рабочей базе данных СУБД (Microsoft SQL Server, PostgreSQL и др.) в процессе выполнения скрипта восстановления резервной копии. Проанализируем архитектуру хранения данных платформы, чтобы понять, почему этот подход не работает.
Журнал регистрации 1С технологически отделен от таблиц СУБД информационной базы. Сервер «1С:Предприятия» сохраняет все записи журнала в локальную файловую систему сервера приложений. По умолчанию файлы располагаются в каталоге данных кластера серверов по пути вида .../srvinfo/reg_XXXX/GUID_информационной_базы/1Cv8Log/. В зависимости от используемого формата журнала это может быть либо база данных SQLite (файл 1Cv8.lgd), либо набор текстовых файлов с расширениями *.lgf и *.lgp. Поскольку внутри СУБД нет никаких служебных таблиц, отвечающих за события ЖР, воздействовать на журнал скриптом к серверу баз данных невозможно.
Для программного управления списком уровней важности событий, которые должны записываться в журнал, платформа предоставляет глобальный метод УстановитьИспользованиеЖурналаРегистрации(). В качестве параметра метод принимает массив значений перечисления УровеньЖурналаРегистрации (например, Информация, Ошибка, Предупреждение, Примечание).
Если в данный метод передать пустой массив, сервер 1С полностью отключает регистрацию любых событий. Рассмотрим базовый пример вызова:
ПустойСписокУровней = Новый Массив;
УстановитьИспользованиеЖурналаРегистрации(ПустойСписокУровней);
Выясним важные особенности работы этого метода, которые необходимо учитывать при проектировании архитектуры автоматизации:
1Cv8Log. Это означает, что настройка сохраняется после перезапуска службы кластера «1С:Предприятия» и перезагрузки сервера. Применять вызов при старте каждого клиентского сеанса не требуется — достаточно выполнить его однократно при инициализации копии.Рассмотрим вариант реализации, когда база данных сама определяет, что она была развернута как копия, и отключает протоколирование. Для этого в процедуру ПриНачалеРаботыСистемы модуля управляемого приложения (или в соответствующий общий модуль инициализации) внедряется логика проверки контура.
Проанализируем пример кода на сервере, который проверяет текущее состояние журнала и отключает его, если текущая база является копией:
&НаСервере
Процедура ОтключитьЖурналРегистрацииДляКопии()
// Проверяем наличие административных прав у текущего пользователя
Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
Возврат;
КонецЕсли;
// Проверяем признак того, что информационная база является тестовой копией
// В типовых конфигурациях на базе БСП можно использовать параметры блокировки работы с внешними ресурсами
// Для произвольных систем можно сравнить строку соединения с эталонным именем рабочей базы
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ЭтоКопия = СтрНайти(ВРег(СтрокаСоединения), "TEST") > 0 ИЛИ СтрНайти(ВРег(СтрокаСоединения), "DEV") > 0;
Если ЭтоКопия Тогда
// Получаем текущие зарегистрированные уровни
ТекущиеУровни = ПолучитьИспользованиеЖурналаРегистрации();
// Если массив не пустой — журнал все еще активен, выполняем отключение
Если ТекущиеУровни.Количество() > 0 Тогда
ПустойМассив = Новый Массив;
УстановитьИспользованиеЖурналаРегистрации(ПустойМассив);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Наиболее надежным и чистым подходом в рамках процессов DevOps является выполнение команды отключения журнала сразу после создания информационной базы, до того, как в нее зайдут конечные пользователи. Для этого сформируем пакетный сценарий вызова платформы с внешней обработкой.
Разберем по шагам создание такой автоматизации:
DisableLog.epf). В модуле формы или в модуле объекта при открытии пропишем установку пустого массива и немедленное закрытие программы:
Процедура ПриОткрытии()
Попытка
УстановитьИспользованиеЖурналаРегистрации(Новый Массив);
Исключение
// Запись в лог или вывод сообщения при ошибке прав
КонецПопытки;
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
1cv8.exe ENTERPRISE /S "ServerName\CopyBaseName" /N "Administrator" /P "AdminPassword" /Execute "C:\Scripts\DisableLog.epf" /DisableStartupMessages
После выполнения этой команды тестовая база готова к работе, а журнал регистрации полностью выключен.
В некоторых сценариях полного отключения журнала не требуется: разработчикам или тестировщикам может понадобиться фиксация критических ошибок приложения при полном исключении высоконагруженных рутинных событий (фоновые задания, аутентификация, фиксация транзакций).
Платформа позволяет выполнить тонкую настройку с помощью методов УстановитьИспользованиеСобытияЖурналаРегистрации() и объекта ИспользованиеСобытияЖурналаРегистрации. С их помощью можно программно выключить запись транзакций и изменений данных, оставив системные сбои:
НастройкаСобытия = Новый ИспользованиеСобытияЖурналаРегистрации;
НастройкаСобытия.Использование = Ложь;
// Отключаем фиксацию транзакций
УстановитьИспользованиеСобытияЖурналаРегистрации("_$Transaction$_.Commit", НастройкаСобытия);
Если же копия была развернута вместе с объемным каталогом старого журнала регистрации и требуется быстро освободить место на диске сервера приложений, применим метод программной очистки:
// Удаляем все записи журнала до текущей даты включительно
ОчиститьЖурналРегистрации(ТекущаяДата());
Иногда администраторы пытаются заблокировать запись журнала на уровне прав доступа операционной системы (отзыв прав на запись у учетной записи службы usr1cv8 к папке 1Cv8Log) либо создают символические ссылки на фиктивные устройства (вроде NUL или /dev/null). Делать этого категорически нельзя. В современном формате SQLite при невозможности выполнить операцию записи серверные процессы 1С сталкиваются с непредвиденными блокировками ввода-вывода, что приводит к зависанию пользовательских сеансов и аварийному падению рабочих процессов кластера rphost. Отключение журнала должно выполняться исключительно штатным программным интерфейсом платформы.