Мониторинг журнала регистрации при помощи Powershell

12.07.18

Разработка - Инструментарий разработчика

Работа с журналом регистрации в формате SQLite внешними средствами на примере мониторинга изменений в конфигурации базы данных.

Скачать файл

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

Наименование По подписке [?] Купить один файл
Мониторинг журнала регистрации при помощи Powershell
.zip 1,11Mb
6
6 Скачать (1 SM) Купить за 1 850 руб.

Немного о Powershell

Powershell - расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев. 
PowerShell версии 2.0 - неотъемлемый компонент в составе Windows 7, Windows 8 и Windows Server 2008 R2 и др. Т.е. доустанавливать обычно ничего не надо - все уже есть в системе.
Требуемую функциональность для своих задач можно наращивать при помощи уже готовых скриптов-командлетов. Базовых операций очень много, изобретать велосипеды не обязательно. В открытом доступе можно найти множество готовых решений, созданных другими пользователями, не только Microsoft (кстати, тоже бесплатно).

Про журнал регистрации и его мониторинг

Зачем мониторить журнал регистрации? 
Ну, например, можно делать выборку последних ошибок за час и отправлять их на рассмотрение службе поддержки. Или сигнализировать о частом появлении определенных типов ошибок. Или мониторить работоспособность регламентных заданий.
Одна из задач - получение оповещений о том, что конфигурация БД изменилась. На основе этого события можно запускать, например, сохранение конфигурации из SQL, можно отправлять уведомление разработчикам, чтобы они были в курсе и не теребили владельца продукта вопросами вида "а ты накатил мои изменения?". Давайте реализуем этот функционал. 

Уже достаточно давно платформа 1С предоставляет возможность вести ЖР в формате SQLite. Одним из преимуществ формата является быстрый поиск по настраиваемым фильтрам. Сразу оговоримся, что далее мы работаем с ЖР именно с этим форматом. Как узнать, что у вас новая версия? Достаточно взглянуть на его начинку, файл журнала находится в 1Cv8.lgd. Уже в первых строках содержится ответ:

 

При обновлении конфигурации базы данных в ЖР попадает событие "Изменение конфигурации базы данных". Выглядит это примерно так:

 

Как же представлено это событие в самой базе SQLite? Откроем файл базы каким-нибудь средством просмотра. Воспользуемся DB Browser for SQLite (есть portable-версия)
 
Открываем базу (1Cv8.lgd) и находим в EventCodes "странное" событие "_$InfoBase$_.DBConfigUpdate". Именно оно отвечает за фразу "Изменение конфигурации базы данных". Учтем, что код события разнится от журнала к журналу для разных баз.

Теперь попробуем найти в основной таблице EventLog все события с таким кодом (в нашем примере 101) и заодно узнаем пользователя, который сделал изменения (данные в таблице UserCodes). Воспользуемся "консолью запросов" DB Browser:

 

Как видим нашлась всего 1 запись. Хотя могло быть сколько угодно. Запрос выполнен за 3.2 секунды для 200-мегового лог-файла, лежащего в локальной сети. Тот же запрос для файла на SSD-диске выполняется 1.7 секунды.
Для задачи уведомлений, нам не обязательно знать все моменты обновления, поэтому если ограничить выборку определенной датой, то запрос выполняется в разы быстрее: доли секунды.

Давайте попробуем сделать выборку при помощи скрипта на Powershell. Находим первый попавшийся PSSQLite PowerShell Module 
для работы с SQLite. Пакет работает на Powershell 2.0, не требует инсталляции, достаточно просто скопировать его в папку и он готов к работе.
Тут же прекрасная документация по работе с методами, разобраться можно за считанные минуты. 
Искомые события найдем при помощи метода Invoke-SqliteQuery:

    ##### подключить модуль
    Import-Module .\PSSQLite

    ## ищем событие, отвечающее за обновление базы данных
    $db_update_string = '"_$InfoBase$_.DBConfigUpdate"'
    try {
        $data_row = Invoke-SqliteQuery -DataSource $path_to_ZhR -as "DataRow" -Query "select code from EventCodes where name = '$db_update_string'" 
    }
    catch {
        show_message("Ошибки при получении данных из базы: $error")
        exit 1
    }

    $db_update = $data_row.Code
    if (!$db_update) 
    {
        show_message("нет события обновления БД")
        exit 0
    }
    show_message("Код события обновления БД: <$db_update>")
    
    $query = "SELECT connectid,`
                date as original_date,`
                datetime(date/10000-$utc_seconds,'unixepoch') as date ,`
                comment, `
                UserCode, `
                UserCodes.uuid, `
                UserCodes.name as user `
            FROM EventLog `
            left join  UserCodes on  EventLog.userCode = UserCodes.code`
            where eventcode=$db_update `
                and date>$date_content `
            ORDER BY date asc `
            LIMIT 10"

    try {
        $data_row = Invoke-SqliteQuery -DataSource $path_to_ZhR -as "DataRow" -Query $query    
    }
    catch {
        show_message("Ошибки при получении данных из базы: $error")
        exit 1
    }
    
    if (!$data_row)
    {
        show_message("Не найдено обновлений")
        exit 0
    }
    

    
Итак, мы нашли нужные события, теперь надо отправить их куда-то. Например, в slack

Отправка в Slack при помощи PowerShell

С отправкой в слак все еще проще с точки зрения реализации. Создана простейшая функция по отправке сообщения в канал. Нужно знать только token.

function SendToSlack {
    param (
        [Parameter(Mandatory=$true, Position=0)]$Text,
        $token="xxxxx",
        $Username, 
		$Proxy , 
        $Channel 
    )
	$max_dlina=500
	if ($text.length -gt $max_dlina)
	{
		$Text = $Text.Substring(0,$max_dlina)+"..." # ограничим длину сообщения, чтобы слак смог принять
	}
	$postSlackMessage = @{token=$token;channel=$Channel;text=$Text;username=$username;as_user=$true}
	$response =	Invoke-RestMethod -Uri https://slack.com/api/chat.postMessage -Body $postSlackMessage -Proxy $Proxy 
	show_message "Результат отправки: $response"

}

Код прост, но есть ложка дегтя - для выполнения метода Invoke-RestMethod требуется powershell версии 3.0. Для Windows server 2012 это не проблема, он уже установлен, а вот обладателям более ранних версий операционной системы придется доставить соответствующие пакеты. В частности, на windows server 2008 r2 (sp1) надо поставить Windows Management Framework 3.0 (Windows6.1-KB2506143-x64.msu) 

Не Slack-ом единым

Для тех, кто предпочитает уведомления просто в почту, достаточно воспользоваться командлетом Send-MailMessage. Он, кстати, работает и на версии 2.0.

    Send-MailMessage -From "1C-reports@domain.ru" -To "1C-developers@domain.ru" -Subject "обновление базы" -Body "сообщение"

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

Про права

Сам журнал регистрации не требует особых прав на доступ к нему - достаточно просто прав на чтение файла. А вот powershell-скрипты должны быть разрешены во избежание получения сообщения "...так как выполнение скриптов запрещено для данной системы".
Это делается один раз командой

    ## Restricted (Запрещено, по умолчанию) Сценарии не запускаются.
    ## Allsigned (Все подписанные) Запускаются только подписанные сценарии.
    ## RemoteSigned (Удаленные подписанные) Разрешен запуск локальных сценариев, прочие сценарии должны быть подписаны.
    ## Unrestricted (Без ограничений) Запускаются все сценарии.
    set-executionpolicy remotesigned

Кстати, о доступе к файлу журналу. Наш скрипт не мешает штатной работе 1С. Можно подключаться к "боевому" файлу журнала. Проводили эксперимент, чтобы проверить влияние механизма на работу 1С. Запускали фоновое задание, строчащее в ЖР по сотне сообщений в секунду. Одновременно стартовали скрипт - все отрабатывается без ошибок. База клиент-серверная, скрипт стоит локально на сервере. Никто никому не мешает

Что в итоге

Сам powershell-скрипт можно запускать через планировщик windows от имени сервисной учетной записи, встраивать в сборочные линии и находить другие применения. 
За рамками статьи остались нюансы превращения времени unix в нормальные человекопонятные даты и учет часовых поясов. Эти моменты можно посмотреть в самом скрипте, который прикладывается к статье. Также скрипт умеет "запоминать" последнее время работы, пишет в лог, что он делал и    отправляет сообщения в Slack. В архиве приложена и сама библиотека для работы с SQLite

Ссылки

Powershell журнал регистрации slack sqlite

См. также

SALE! %

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 10000 руб.

02.09.2020    161296    893    399    

872

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    8571    66    29    

76

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    15686    39    8    

73

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

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

9360 руб.

17.05.2024    23842    70    45    

119

SALE! %

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

15000 10000 руб.

10.11.2023    10664    38    27    

63

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3840 руб.

14.01.2013    188494    1142    0    

913

SALE! %

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 15000 руб.

07.10.2021    17556    6    32    

42

Инструментарий разработчика Программист Платные (руб)

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

1800 руб.

21.02.2023    7832    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Timur.V 80 12.07.18 16:10 Сейчас в теме
Вы подключаетесь к файлу журнала регистрации, который не подключен к базе 1с. Верно?
4. user768334 190 13.07.18 07:55 Сейчас в теме
(1) Спасибо за вопрос!
На самом деле можно подключаться к ЛЮБОМУ файлу журнала. Проводили эксперимент, чтобы проверить работоспособность механизма. Запускали фоновое задание, строчащее в ЖР по сотне сообщений в секунду. Запускали скрипт - все отрабатывается без ошибок. База клиент-серверная, скрипт стоит локально на сервере.
Никто никому не мешает
2. blackhole321 1314 12.07.18 18:46 Сейчас в теме
Почему Вы рекомендуете запускать скрипт в планировщике из под системной учётной записи (я так понимаю Вы имели ввиду system)?
5. user768334 190 13.07.18 08:07 Сейчас в теме
(2) Про рекомендации речь не идет, написано, что можно. Лучше, чтобы это была какая-то сервисная учетка.
blackhole321; +1 Ответить
6. blackhole321 1314 13.07.18 08:36 Сейчас в теме
(5)Ну если не сложно, по моему мнению лучше-бы поправить в статье, а то кто-нибудь так и будет из под system запускать
kraynev-navi; +1 Ответить
3. blackhole321 1314 12.07.18 18:52 Сейчас в теме
И да, Set-ExecutionPolicy надо выполнять из под аккаунта с административными привилегиями
user768334; +1 Ответить
7. artbear 1563 17.07.18 09:51 Сейчас в теме
ОФФ/2 У powershell есть несколько проблем использования:
+ Язык довольно таки необычен и обучиться не так просто
+ если возвратиться к нему после некоторого перерыва неиспользования, сложно восстановить знания и приходится делать много усилий.
+а слишком часто пользоваться им не получается, т.к. мы все-таки 1С-специалисты, а не чистые администраторы

Это результаты моего опыта и несколько моих коллег.

Поэтому последние годы мы пересели с powershell на OneScript :) и активно развиваем его инфраструктуру.

PS о моих компетенциях на Powershell - занимался им не один год.
Делал на Powershell целый продукт для одной известного розничной сети - полностью автоматическое обновление розничных точек для 1С 7.7 :) по всей стране - 3,5 тысячи точек.
С авто-тестами, BDD (Pester) и все такое :)
astrallight; +1 Ответить
Оставьте свое сообщение