Как автоматически очистить журнал активности пользователей 1С?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Введение: Почему автоматическая чистка журнала регистрации 1С так важна?

Журнал регистрации (ЖР) в 1С:Предприятии — это незаменимый инструмент для аудита и мониторинга событий, происходящих в информационной базе. Он фиксирует действия пользователей, изменения данных, ошибки и другие важные события. Однако со временем ЖР может значительно разрастаться, занимая гигабайты и даже терабайты дискового пространства. Это не только приводит к нехватке места на сервере, но и замедляет работу самой платформы 1С, так как операции с большим журналом становятся ресурсоемкими. Ручная чистка множества баз становится неэффективной и трудозатратной задачей для системного администратора. В этой статье мы подробно рассмотрим различные подходы к автоматической чистке журнала регистрации 1С, разберем их особенности и предоставим практические рекомендации.

Понимание журнала регистрации 1С: форматы и расположение

Прежде чем мы перейдем к методам очистки, давайте выясним, как устроен журнал регистрации в 1С.

  1. Расположение:

    • Для клиент-серверного варианта 1С: Журнал хранится в каталоге сервера 1С:Предприятия по пути, аналогичному C:\Program Files\1cv8\srvinfo\reg_<cluster_id>\<base_id>\1Cv8Log\. Где <cluster_id> и <base_id> — это идентификаторы кластера и конкретной информационной базы.

    • Для файлового варианта 1С: Журнал располагается непосредственно в папке с базой данных, в подкаталоге 1Cv8Log.

  2. Форматы:

    • Старый (текстовый) формат: Файлы журнала имеют расширение *.lgf. Этот формат представляет собой набор текстовых файлов, которые могут быть разделены по дням, неделям и т.д. Он прост в администрировании с точки зрения файловых операций.

    • Новый (SQLite) формат: Начиная с версии 8.3.5.1068, 1С поддерживает хранение журнала регистрации в формате SQLite. Файлы такого журнала имеют расширение *.lgd. Этот формат обеспечивает повышение скорости поиска, надежности хранения и ускорение многопоточной записи. Однако работа с ним требует специфических подходов к очистке, отличных от обычного удаления файлов.

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

Метод 1: Сокращение журнала регистрации с помощью ключа `/ReduceEventLogSize`

Один из распространенных способов сокращения журнала регистрации — использование ключа командной строки /ReduceEventLogSize в режиме Конфигуратора. Этот метод применим как к текстовому, так и к SQLite формату, но имеет свои нюансы.

Принцип работы ключа `/ReduceEventLogSize`

Ключ /ReduceEventLogSize позволяет удалить из журнала регистрации все записи, дата которых предшествует указанной дате. Мы можем также сохранить удаляемую часть журнала в отдельный файл с помощью параметра -saveAs. Это удобно для архивирования старых записей или их выгрузки в Excel.

Пример PowerShell скрипта для сокращения журнала

Рассмотрим пример PowerShell скрипта, который может быть использован для выполнения этой операции. Этот скрипт был предложен в исходном сообщении темы:


param (
    [string]$1cexe = "C:\Program Files\1cv8\8.3.17.1851\bin\1cv8.exe",
    [string]$1cbase = "SRV-BD-15:1541\TestBD",
    [string]$1cuser = "Administrator",
    [string]$1cupassword = "Administrator",
    [string]$1coperlog = "D:\scripts\log\1cshrink.log",
    [string]$1cdaysoflogstore = 90,
    [string]$1clogsarchive = "D:\scripts\journal\",
    [string]$1clogfilename = $env:COMPUTERNAME.ToLower() + "-1clog-" + ($1cbase.split("\"))[1] + "-" + (get-date).Date.ToString("yyyyMMdd") + ".elf"
)
$1clog = $1clogsarchive + $1clogfilename
cmd /c "`"`"$1cexe`" CONFIG `/s$1cbase `/N`"$1cuser`" `/P`"$1cupassword`" `/Out$1coperlog `/ReduceEventLogSize $((get-date).Date.AddDays(-$1cdaysoflogstore).ToString("yyyy-MM-dd")) -saveAs`"$1clog`"`""

Давайте разберем параметры этого скрипта:

Команда cmd /c "`"`"$1cexe`" CONFIG ...`"" запускает 1С в режиме Конфигуратора, используя возможности командной строки Windows, для выполнения сокращения журнала.

Нюансы для SQLite формата (`.lgd`)

При использовании /ReduceEventLogSize для журнала в формате SQLite (.lgd) следует учитывать важный момент: сам файл журнала регистрации не уменьшается в размере после операции сокращения. Удаленные записи просто помечаются как свободное место внутри файла, которое может быть использовано для новых записей. Для фактического физического уменьшения размера файла .lgd необходимо выполнить операцию VACUUM.

Для выполнения VACUUM необходимо:

  1. Остановить службу агента сервера 1С:Предприятия, чтобы файл 1Cv8.lgd был свободен.
  2. Использовать утилиту sqlite3.exe. Эта утилита обычно поставляется вместе с платформой 1С или может быть загружена отдельно.
  3. Выполнить команду в командной строке: sqlite3.exe C:\<путь к файлу>\1Cv8.lgd vacuum

    Где C:\<путь к файлу>\1Cv8.lgd — это полный путь к файлу журнала регистрации.

  4. После завершения операции VACUUM, можно снова запустить службу агента сервера 1С.

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

Метод 2: Разделение Журнала Регистрации по периодам (рекомендуемый подход для текстового формата)

Для журналов регистрации, использующих текстовый формат (*.lgf), одним из наиболее удобных и надежных способов автоматической чистки является настройка разделения журнала по периодам. Этот метод позволяет платформе 1С самостоятельно создавать отдельные файлы журнала для каждого периода (час, день, неделя, месяц, год), что значительно упрощает их последующее администрирование с помощью стандартных файловых операций.

Как это работает и почему это эффективно

Когда мы настраиваем разделение журнала, например, по дням, 1С создает новый файл журнала каждый день. В результате мы получаем набор файлов, таких как 1Cv8Log_YYYYMMDD_HHMMSS.lgf. Теперь, чтобы удалить старые записи, нам не нужно выполнять сложные операции сокращения внутри файла. Мы просто можем удалить файлы, которые старше определенного количества дней, используя простые скрипты на PowerShell или командные файлы.

Преимущества данного подхода:

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

  2. Меньше рисков: Мы работаем с целыми файлами, а не с их содержимым, что снижает риск повреждения журнала или нарушения его индексов.

  3. Гибкость: Можно настроить разделение с разной степенью детализации (час, день, неделя, месяц, год) в зависимости от потребностей и интенсивности записи в журнал.

Настройка разделения журнала в Конфигураторе

Для того чтобы настроить разделение журнала регистрации, выполните следующие шаги:

  1. Запустите 1С:Предприятие в режиме Конфигуратор для нужной информационной базы.

  2. В главном меню перейдите в раздел "Администрирование".

  3. Выберите пункт "Настройка журнала регистрации".

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

  5. Установите желаемый режим разделения, например, "День" или "Неделя". Мы рекомендуем использовать разделение по дням или неделям, так как это обеспечивает хороший баланс между детализацией и управляемостью размером файлов.

  6. Сохраните изменения.

Пример концептуального скрипта для удаления старых файлов

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


# Путь к папке с журналами регистрации (пример для клиент-серверного варианта)
# Вам нужно будет определить этот путь для каждой базы
$LogsPath = "C:\Program Files\1cv8\srvinfo\reg_<cluster_id>\<base_id>\1Cv8Log\" 

# Количество дней, после которых файлы будут удалены
$DaysToKeep = 90

# Вычисляем дату, старше которой файлы будут удалены
$CutOffDate = (Get-Date).AddDays(-$DaysToKeep)

# Получаем все файлы .lgf в папке журнала
Get-ChildItem -Path $LogsPath -Filter "*.lgf" | ForEach-Object {
    # Извлекаем дату из имени файла (если имя соответствует формату 1Cv8Log_YYYYMMDD_HHMMSS.lgf)
    # Здесь нужна более сложная логика парсинга, или просто сравнивать CreationTime/LastWriteTime
    
    # Более надежный способ: сравниваем по дате изменения файла
    if ($_.LastWriteTime -lt $CutOffDate) {
        Write-Host "Удаление файла: $($_.FullName) (дата изменения: $($_.LastWriteTime))"
        Remove-Item $_.FullName -Force -ErrorAction SilentlyContinue
    }
}

Важно: Перед использованием подобных скриптов всегда делайте резервные копии и тщательно тестируйте их в тестовой среде. Путь $LogsPath необходимо адаптировать для каждой вашей информационной базы. Если у вас более 30 баз, как указано в обсуждении, вы можете создать список путей или использовать более сложные методы для их автоматического обнаружения на сервере 1С.

Метод 3: Работа с журналом регистрации в формате SQLite (`.lgd`)

Для информационных баз, использующих журнал регистрации в формате SQLite (.lgd), подходы к очистке имеют свои особенности. Как мы уже выяснили, прямой /ReduceEventLogSize не уменьшает размер файла, а лишь освобождает место внутри него. Однако есть и другие, более эффективные методы.

Конвертация форматов: туда и обратно

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

Процесс конвертации можно настроить через Конфигуратор в разделе "Администрирование" -> "Настройка журнала регистрации" -> "Изменить формат".

Программные методы 1С для SQLite-журнала

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

  1. СкопироватьЖурналРегистрации(): Этот метод позволяет скопировать часть журнала регистрации за определенный период в новый файл. Мы можем использовать его для архивации старых записей.

  2. ОчиститьЖурналРегистрации(): Этот метод позволяет удалить записи из журнала регистрации до указанной даты. После его выполнения, если журнал находится в формате SQLite, для фактического уменьшения размера файла по-прежнему потребуется операция VACUUM (которую нужно выполнить извне 1С).

Пример использования ОчиститьЖурналРегистрации():


// Получаем объект менеджера журнала регистрации
МенеджерЖурнала = ЖурналРегистрации.ПолучитьМенеджерЖурнала();

// Определяем дату, до которой нужно очистить журнал
// Например, очистить журнал до даты 90 дней назад
ДатаОчистки = ТекущаяДата() - 90 * 60 * 60 * 24; 

// Вызываем метод очистки
МенеджерЖурнала.ОчиститьЖурналРегистрации(ДатаОчистки);

Этот код можно включить в регламентное задание, которое будет выполняться, например, еженедельно или ежемесячно. После выполнения этого регламентного задания, как упоминалось ранее, для физического сжатия файла .lgd нужно будет выполнить VACUUM с помощью sqlite3.exe, остановив службу 1С:Предприятия.

Использование сторонних утилит для SQLite

Для более тонкого управления и сокращения файлов .lgd, особенно если вы хотите выборочно удалять записи по определенным критериям (коды событий, виды метаданных) или проводить ручную оптимизацию, можно использовать специализированные утилиты для работы с базами SQLite, например, "DB Browser for SQLite".

С помощью таких программ мы можем:

  1. Открыть файл 1Cv8.lgd (предварительно остановив службу агента сервера 1С).

  2. Выполнять SQL-запросы для удаления ненужных записей, например: DELETE FROM EventLog WHERE Date < 'YYYY-MM-DD HH:MM:SS';

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

Всегда создавайте резервную копию каталога журнала регистрации перед выполнением любых операций с файлами .lgd с помощью сторонних утилит!

Общие рекомендации и важные аспекты

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

  1. Архивирование: Мы всегда должны архивировать удаляемые записи журнала. Это позволит нам обратиться к ним в случае необходимости для анализа или аудита. Используйте параметр -saveAs при работе с /ReduceEventLogSize или просто перемещайте старые файлы в архивный каталог при файловой чистке.

  2. Производительность: Большой журнал регистрации может существенно влиять на производительность 1С. Операции чтения, записи и поиска в ЖР становятся медленнее. Регулярная очистка или разделение помогает поддерживать оптимальную производительность — для этого есть архивация и свертка данных журнала изменений.

  3. Уровень детализации: Мы можем управлять объемом записываемых в журнал сообщений. Это настраивается через Конфигуратор: "Администрирование" -> "Настройка журнала регистрации". Здесь мы можем выбрать, какие события будут регистрироваться (ошибки, предупреждения, информация, примечания). Снижение уровня детализации для некритичных событий поможет уменьшить рост ЖР.

    Также существуют программные методы ПолучитьИспользованиеЖурналаРегистрации() и УстановитьИспользованиеЖурналаРегистрации() для управления уровнем детализации из кода 1С.

  4. Удаление неиспользуемых папок: После удаления баз данных с сервера 1С, их папки журналов регистрации могут оставаться в каталоге srvinfo, занимая ценное дисковое пространство. Мы можем вычислить и удалить эти папки, сверив их идентификаторы с содержимым файла 1CV8Clst.lst, который хранит информацию о зарегистрированных базах.

  5. Не отключайте журнал регистрации полностью: Хотя технически можно отключить журнал регистрации через Конфигуратор (в монопольном режиме), мы настоятельно не рекомендуем это делать. Журнал — это наш первый помощник при возникновении ошибок, сбоев или спорных ситуаций. Отсутствие записей сделает расследование проблем практически невозможным.

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

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

← На главную