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

Публикация № 865771

Администрирование - Администрирование данных 1С - Сервисные утилиты

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

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

Немного о 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

.zip 1,11Mb
5
.zip 1,11Mb 5 Скачать

Специальные предложения

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

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

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

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

См. также

Повышение качества разработок и онлайн контроль ошибок Промо

Журнал регистрации v8 Абонемент ($m)

Анализ ошибок и сбор ошибок журнала регистраций из десятков и сотен баз в одном месте.

09.03.2018    26922    DitriX    48    

Мультибазовая очистка Журнала регистрации с автоматическим перемещением архивных данных в указанный каталог

Журнал регистрации v8 Россия Абонемент ($m)

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

1 стартмани

26.12.2019    3354    bryantsev.yury    3    

Командный интерпретатор для 1С

Сервисные утилиты v8 1cv8.cf Абонемент ($m)

Инструмент для выполнения команд CMD / PowerShell из 1С.

2 стартмани

15.11.2019    13644    28    YPermitin    41    

Централизованное управление кластером 1С Предприятия, состоящим из нескольких рабочих серверов, работающих на платформе GNU/Linux

Сервисные утилиты v8 Абонемент ($m)

При эксплуатации крупных информационных систем, в состав которых могут входить десятки серверов 1С Предприятия, зачастую возникают ситуации, требующие однотипных действий на всех серверах кластера 1С Предприятия или на всех серверах контура. В настоящей статье представлен способ централизованного управления серверами 1С Предприятия, работающими на платформе GNU/Linux. Подобный подход может быть использован и для других задач, возникающих в процессе эксплуатации крупных систем, с целью сокращения как временных затрат специалистов, так и времени простоя системы.

1 стартмани

26.08.2019    3950    Sloth    0    

Как отправить ошибки из журнала регистрации на почту?

Журнал регистрации v8 УПП1 Абонемент ($m)

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

1 стартмани

06.02.2019    9192    wowik    0    

Go. Разбор лога технологического журнала. Достойная альтернатива perl'у

Сервисные утилиты Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Началось все с того, что я познакомился с перловыми скриптами для парса ТЖ которые размещены на kb.1c.ru (например в этой статье https://kb.1c.ru/articleView.jsp?id=113). По началу мне дико понравилось то, что перл разбирал гигабайты логов за считанные минуты, но позитив мой угасал обратно пропорционально с тем, насколько глубже я погружался в "кроличью нору" ....

1 стартмани

24.10.2018    20671    lazarenko    39    

Журнал регистрации 1С (sql lite) в web app

Журнал регистрации v8 1cv8.cf Абонемент ($m)

Данная публикация рассматривает построение компонентного решения работы журнала регистрации в стороннем приложении(web app). Встала задача миграции sql lite жр во внешнюю базу. Данное решение было создано: 1. для хранения жр за весь период 2. для ускорения работы с жр 3. для ускорения сервера предприятия, так как именно он (а точнее рагент) пытается записать данные в жр sql lite(фактически файл на диске), после увеличения размера файла более 10 гб, поступали жалобы по вопросу быстродействия 1с (и не только ради этого) Данная публикация может быть полезной администраторам, программистам, оптимизаторам.

1 стартмани

09.07.2018    9763    dmarenin    8    

Tool1CD: отрежем донорскую почку

Сервисные утилиты Разработка внешних компонент v8 Розница Абонемент ($m)

Ваша база мертва? Что ж, кое-что в ней ещё теплится.

1 стартмани

15.05.2018    19018    baton_pk    13    

Использование регулярных выражений (RegExp) в Linux

Сервисные утилиты Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

1 стартмани

20.04.2018    8838    vsbronnikov    12    

Мониторинг изменений рабочих конфигураций. Часть 1. Сохранение конфигураций из базы SQL без конфигуратора

Сервисные утилиты v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.02.2018    19622    user768334    25    

Практика доступа в базу 1С через протокол oData. Чтение данных

Сервисные утилиты Практика программирования Администрирование данных 1С v8 1cv8.cf Абонемент ($m)

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    106894    Dementor    57    

Перенос журналов регистрации при изменении сервера приложения 1С (клиент-серверный вариант)

Журнал регистрации v8 1cv8.cf Россия Абонемент ($m)

Описание расположения журналов регистрации информационных баз 1С при клиент-серверном варианте работы с 1С:Предприятие 8. Пример переноса журналов регистрации информационной базы 1С с платформы 1С:8.2 на платформу 1С:8.3

15.08.2017    23904    OlegAl    2    

Ошибка формата файла журнала регистрации, database disk image is malformed

Журнал регистрации v8 1cv8.cf Бесплатно (free)

Ошибка формата файла журнала регистрации по причине: sqlite3_step failed: database disk image is malformed db: C:\Program Files\1cv8\srvinfo\reg_1541\34eda2fe-bcf4-485e-ab47-4f302319f59a\1Cv8Log\1Cv8.lgd sql: SELECT severity, date, connectID, session, transactionStatus, transactionDate, transactionID, userCode, computerCode, appCode, eventCode, comment, metadataCodes, sessionDataSplitCode, dataType, data, dataPresentation, workServerCode, primaryPortCode, secondaryPortCode FROM EventLog WHERE date<3155378867999999 AND eventCode IN (1,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42) ORDER BY date DESC

27.09.2015    91746    mrWatson    30    

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Сервисные утилиты Производительность и оптимизация (HighLoad) Практика программирования Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

28.09.2012    29545    ghostaz    39