gifts2017

Парсинг технологического журнала 1С средствами SQL CLR

Опубликовал Марат Биккин (squad) в раздел Администрирование - Системное

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

Зачем нужен парсер файлов технологического журнала?

     Читать данные в текстовом виде не слишком удобно, особенно если нам нужно найти какое-либо определенное событие.  Например, текст SQL запроса среди тысяч записей в  десятках папок с идентификаторами рабочих процессов.

Кроме того иногда бывает необходимо автоматизировать сбор информации из логов ТЖ на периодической основе и проанализировать информацию из них за большой период времени.

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

Функция написана на C# и может использовать все расширения классов .NET.

Как это работает ?

Вы открываете SQL Server Management Studio (SSMS), выбираете New Query и набираете следующий текст:

select * from  ParseLogFiles({сетевой каталог с файлами ТЖ})

Функция возвращает вам таблицу с данными технологического журнала как показано на скриншотах. 

Естественно что к результатам можно применять любой функционал T-SQL, например WHERE, ORDER BY или JOIN, например:

select distinct SqlText,CONTEXT from  ParseLogFiles({сетевой каталог с файлами ТЖ})

where BaseName= 'YourBaseName' and CONTEXT is not null

Таким образом поиск контекста исполнения любого запроса, попавшего в журнал становится делом нескольких секунд.

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

Полностью статья доступна в приложенном файле.  В дополнительных файлах можно скачать текст функции или уже откомпилированную сборку этой функции.

P. S. Можно пойти еще дальше и соединить результаты, возвращаемые функцией, с результатами некоторых DMV и получить максимально полную информацию в одной таблице. Например, на скриншоте приведено суммарное время выполнения запросов в SQL с контекстом исполнения в 1С (описание того как получить такой результат уже к сожалению выходит за рамки данной статьи).

 



Скачать файлы

Наименование Файл Версия Размер
Парсинг файлов технологического журнала 1С с помощью SQL CLR 112
.docx 70,69Kb
29.11.11
112
.docx 70,69Kb Скачать
Скомпилированная сборка 54
.dll 7,50Kb
29.11.11
54
.dll 7,50Kb Скачать
Листинг ParseLog.cs 67
.cs 11,84Kb
29.11.11
67
.cs 11,84Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
0. Марат Биккин (squad) 29.11.11 16:00
В статье рассказывается о том как реализовать парсинг (разбор) файлов технологического журнала c помощью SQL CLR, а также настроить хранение информации из него в базе данных.
В статье приведен полный листинг функции, а также примеры использования.

Перейти к публикации

1. Ийон Тихий (cool.vlad4) 29.11.11 16:00
укажи, как включать sql clr
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
если это есть в статье - извиняй, не увидел
ЗЫ sql clr кстати по сравнению с обычным t-sql по производительности превосходит в случаях разбора строк и текстов
ЗЫ да и заслуженный +
ЗЫЗЫ Как-то некрасивенько
 while (1 == 1) 
           {
           str = sr.ReadLine();
           sContext = sContext + " " + str;
           if (str.Contains("'")) break;
       }
...Показать Скрыть

но ничего еще раз спс,
mant; cleaner_it; squad; +3 Ответить 1
2. Марат Биккин (squad) 29.11.11 17:15
(1) cool.vlad4, Да, в статье про то как "включается" CLR написано. Вот кстати небольшое дополнение: если Reconfigure будет выдавать ошибку можно попробовать Reconfigure With Override.

Приведенный фрагмент кода некрасивый - с этим согласен, но тут уж скорее вопросы к формату текстового файла 1С. Ловить так кроме этой кавычки нечего :)

Был бы лог в виде структурированного текста, например в формате XML - был бы красивый код.
3. Дмитрий Баранов (Sunhare) 08.12.11 17:22
4. Владимир Буоц (vbuots) 15.02.12 13:16
Если всё прошло удачно, то вне зависимости от способа которым мы погружали сборку, можно увидеть нашу новую функцию открыв SMSS на ветке Functions>Table-valued Functions, примерно как показано на рисунке:

У меня он создал в ветке "Programmability" - "Assemblies", с именем "parselog". Вопрос, что дальше, создавать функцию руками?(как?) или как к ней обращаться в таком случае?
5. Владимир Буоц (vbuots) 15.02.12 14:13
(4) vbuots,
а саму функцию не создал
Invalid object name 'dbo.ParseLogFiles'.
6. Michael Smith (opiumdx) 17.02.12 10:46
Спасибо, очень емкая и интересная статья, я понял что шел неверной дорогой.))
7. Александр Зайцев (ozaycev) 18.06.12 15:51
У меня он создал в ветке "Programmability" - "Assemblies", с именем "parselog". Вопрос, что дальше, создавать функцию руками?(как?) или как к ней обращаться в таком случае?

У меня та же ситуация. Где код SQL функции???
8. Марат Биккин (squad) 18.06.12 16:00
Откройте SSMS-New Query
Вставьте ваш код, например select * from <ИмяВашейБазы>.dbo.ParseLogFiles('<ИмяКаталогаФайловТЖ>','*.*')
9. Марат Биккин (squad) 18.06.12 16:01
(5) vbuots,
Имя вашей базы указали ?
10. Kostya Zhurov (It-developer) 19.09.12 12:59
Добрый день!
Делаю все по статье. Создалась функция "Programmability" - "Assemblies", с именем "parselog". Пытаюсь выполнить запрос select * from <ИмяВашейБазы>.dbo.ParseLogFiles('<ИмяКаталогаФайловТЖ>','*.*'). Но у меня нет таблицы dbo.ParseLogFiles. Что делать подскажите, пожалуйста
11. Марат Биккин (squad) 19.09.12 13:14
Собственно таблицы ParseLogFiles и не должно быть - это функция, которая возвращает таблицу, поэтому мы можем обратиться к ней с помощью select
Функция создалась в Assemblies выбранной вами базы или в другой базе ?
12. Kostya Zhurov (It-developer) 19.09.12 13:21
Да, создалась в Assemblies в выбранной мной базе
13. Марат Биккин (squad) 19.09.12 13:44
В таком случае должно работать.
Ошибку какую выдает ?
14. Kostya Zhurov (It-developer) 19.09.12 14:21
Код запроса:
use test2
select * from dbo.parselog('z:\\Bases\\Project_Parse1c\\rphost_1972\\', '*.log')
Ошибка:
Msg 208, Level 16, State 1, Line 2
Invalid object name 'dbo.parselog'.
15. Марат Биккин (squad) 19.09.12 14:31
Попробуйте прямо указать:

select * from test2.dbo.parselog('z:\\Bases\\Project_Parse1c\\rphost_1972\\', '*.log')
16. Kostya Zhurov (It-developer) 19.09.12 14:36
(15) squad,
Тоже ошибка
Msg 208, Level 16, State 1, Line 1
Invalid object name 'test2.dbo.parselog'.
17. Марат Биккин (squad) 19.09.12 14:43
В свойствах сборки (на сборке - правой кнопкой Properties),
General - Permission Set что указано ?
18. Kostya Zhurov (It-developer) 19.09.12 14:47
19. Kostya Zhurov (It-developer) 20.09.12 16:16
Не знаете что еще может быть?
20. Марат Биккин (squad) 21.09.12 07:26
Попробуйте создать новую пустую базу данных и погрузить сборку в неё.
Этим покрайней мере исключим возможные проблемы с нехваткой прав на существующей БД и проблемами при погружении сборки в неё.
21. Kostya Zhurov (It-developer) 21.09.12 18:30
У меня Table-value Function создалась только после создания таблицы TechJournal и
запуска такого кода:

CREATE FUNCTION [dbo].[ParseLogFiles] ( @str nvarchar(4000), @str2 nvarchar(4000) )
RETURNS table
AS return (
select * from pustaya.dbo.TechJournal
)
GO

затем я сделал select * from dbo.ParseLogFiles ('z:\Bases\Project_Parse1c\rphost_1972', '*.log') - ошибок не выдало (Уффф... - не так просто было получить, я ж со всем этим в 1-й раз работаю, но хелпы помогают хорошо).
На выходе - пустая таблица. Вопрос в связи с этим: какая должна быть структура *.log файла 1с(можно пример, который загрузится)? Или как настроить технологический журнал?
22. Марат Биккин (squad) 24.09.12 10:49
Я чего-то не пойму, вы описали функцию которая выбирает записи из таблицы TechJournal ?
Что кроме содержимого TechJournal может вернуть вам эта функция ?
23. Сергей Зеленовский (zels) 30.08.16 11:59
Что означает фраза (сборка с VS2010)
10. Выберите Build > Deploy (yourProjectName). Этим вы погрузите ваш класс и все его функции в базу данных, которую указали в п. 3

Я собирал в соотвествии с "как создать CLR функцию без Visual Studio", там подобного пункта нет.
Может? поэтому ParseLog появился в сборках, а не в функциях и ничего не работает:

ошибка Сообщение 208, уровень 16, состояние 1, строка 1
Недопустимое имя объекта "test.dbo.parselog".

Если test / dbo убрать, будет то же самое
Прикрепленные файлы: