Проблема: На сервере растут логи баз на платформе 8.3.
Необходимо: Часть логов, например, за месяц, оставить доступными напрямую из базы, остальные обрезать и хранить на других дисках. Делать это необходимо автоматически.
Как было раньше(8.1 и 8.2): В конфигураторе можно было указать настройку: «Разделять хранение журнала по периодам» и указать период, например, Неделя. Таким образом, каждая неделя логов хранилась в отдельном файле. Батником копировались и архивировались старые логии на отдельный диск, чтобы они не занимали место на сервере. При необходимости посмотреть «древний» лог, мы возвращали файл за требуемый период на место и просматривали его стандартными средствами 1С.
Как нынче в 8.3: Журнал регистрации хранится в файле 1Cv8.lgd – это файл базы данных sqlite. Настройка «Разделять хранение журнала по периодам» в конфигураторе отсутствует. Осталась кнопка «Сократить», с помощью которой обрезается часть журнала и переносится в указанный файл. Однако после этого размер логов не уменьшается. Что нужно сделать, чтобы размер файла уменьшился, напишу чуть ниже.
Напомню, что все должно работать автоматически. Конфигурация типовая, поэтому трогать ее не будем.
Что было сделано: В планировщике заданий добавил задание, которое выполняет cmd-файл, который запускает 1С с параметрами. В параметре "/Execute", указан путь до обработки, которая копирует часть журнала регистрации в файл, затем эту часть обрезает.
В обработке воспользовался процедурами по работе с журналом регистрации:
Фильтр = Новый Структура("ДатаОкончания"); Фильтр.ДатаОкончания = НачалоГода(ТекущаяДата()); СкопироватьЖурналРегистрации(,ИмяФайлаКопииЖурнала, Фильтр); ОчиститьЖурналРегистрации(Фильтр);
Обработку запускаю cmd-файлом:
"C:\Program Files\1cv82\common\1cestart.exe" ENTERPRISE /S "ServerName:PortNumber\NameBD" /N "ИмяПользователя" /P "Пароль" /Execute "D:\Сократить журнал регистрации\СократитьЖурналРегистрацииПериод.epf" /C "Период=Неделя; СохранитьЖР=D:\Сократить журнал регистрации\НашиЛоги"
В параметре «/С» передается период деления журнала регистрации (День / Неделя / Месяц / Год) и путь до места, где будут храниться обрезанные логи.
После сокращения журнала регистрации размер файла журнала регистрации не изменяется. Чтобы он изменился, необходимо остановить агент сервера и выполнить команду vacuum. Затем запустить службу агента сервера. В планировщике заданий добавил задание, которое выполняет следующий cmd-файл:
net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
sleep 5
D:\scripts\sqlite3.exe D:\ДиректорияХраненияЛоговНаСервере\1Cv8Log\1Cv8.lgd vacuum
net start "1C:Enterprise 8.3 Server Agent (x86-64)"
Утилиту sqlite3.exe можно скачать с официального сайта http://www.sqlite.org/
Для того чтобы в cmd-файле можно было использовать кириллицу, сохраняю его через «Notepad++» в кодировке ОЕМ866.
Что получили: Логи хранятся за каждую неделю в отдельных файлах. Размер файла 1Cv8.lgd не увеличивается.
Обрезанную часть логов, перенесенную в отдельный файл, можно просмотреть штатными средствами 1С: Все функции->Стандартные->Журнал регистрации->Еще->Просмотреть из файла.
Для того чтобы, при необходимости была возможность восстановить обрезанные данные написал небольшую внешнюю обработку, в которую так же добавил весь функционал описанный выше.
Есть идея более простого обрезания и сохранения логов без запуска 1С на сервере с обработкой: можно останавливать агент сервера, переименовывать файл 1Cv8.lgd и запускать сервер. При первом запуске 1С будет создан новый пустой файл журнала регистрации. Главный минус этого варианта: если после переименования файла потребуется посмотреть журнал регистрации, то придется открывать журнал из внешнего файла, который может лежать на недоступном для пользователя диске сервера. В варианте же приведенном выше, в журнале будет храниться история не меньше, чем за указанный период (День / Неделя / Месяц / Год).
В общем-то и все. Если есть замечания и дополнения, добро пожаловать в комментарии. Все важные нюансы обязательно добавлю в статью. Спасибо.