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

29.11.11

База данных - Технологический журнал

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Парсинг файлов технологического журнала 1С с помощью SQL CLR
.docx 70,69Kb
124
124 Скачать (1 SM) Купить за 1 850 руб.
Скомпилированная сборка
.dll 7,50Kb
64
64 Скачать (1 SM) Купить за 1 850 руб.
Листинг ParseLog.cs
.cs 11,84Kb
78
78 Скачать (1 SM) Купить за 1 850 руб.

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

     Читать данные в текстовом виде не слишком удобно, особенно если нам нужно найти какое-либо определенное событие.  Например, текст 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С (описание того как получить такой результат уже к сожалению выходит за рамки данной статьи).

 



См. также

Технологический журнал Мониторинг Системный администратор Программист Абонемент ($m)

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

1 стартмани

15.11.2023    1564    8    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

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

1 стартмани

13.11.2023    4718    9    AlexSTAL    0    

47

Администрирование СУБД Технологический журнал Системный администратор Бесплатно (free)

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

21.09.2023    7250    Andreynikus    14    

83

Технологический журнал Системный администратор Программист Платформа 1С v8.3 Абонемент ($m)

Целью данного решения является организация хранения и анализа данных из технологического журнала 1С с использованием стека Elasticsearch + Logstash + Kibana.

5 стартмани

18.09.2023    5081    huxuxuya    6    

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

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

1. cool.vlad4 2 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 Ответить
2. squad 181 29.11.11 17:15 Сейчас в теме
(1) cool.vlad4, Да, в статье про то как "включается" CLR написано. Вот кстати небольшое дополнение: если Reconfigure будет выдавать ошибку можно попробовать Reconfigure With Override.

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

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

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

У меня та же ситуация. Где код SQL функции???
8. squad 181 18.06.12 16:00 Сейчас в теме
Откройте SSMS-New Query
Вставьте ваш код, например select * from <ИмяВашейБазы>.dbo.ParseLogFiles('<ИмяКаталогаФайловТЖ>','*.*')
10. It-developer 26 19.09.12 12:59 Сейчас в теме
Добрый день!
Делаю все по статье. Создалась функция "Programmability" - "Assemblies", с именем "parselog". Пытаюсь выполнить запрос select * from <ИмяВашейБазы>.dbo.ParseLogFiles('<ИмяКаталогаФайловТЖ>','*.*'). Но у меня нет таблицы dbo.ParseLogFiles. Что делать подскажите, пожалуйста
11. squad 181 19.09.12 13:14 Сейчас в теме
Собственно таблицы ParseLogFiles и не должно быть - это функция, которая возвращает таблицу, поэтому мы можем обратиться к ней с помощью select
Функция создалась в Assemblies выбранной вами базы или в другой базе ?
12. It-developer 26 19.09.12 13:21 Сейчас в теме
Да, создалась в Assemblies в выбранной мной базе
13. squad 181 19.09.12 13:44 Сейчас в теме
В таком случае должно работать.
Ошибку какую выдает ?
14. It-developer 26 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 181 19.09.12 14:31 Сейчас в теме
Попробуйте прямо указать:

select * from test2.dbo.parselog('z:\\Bases\\Project_Parse1c\\rphost_1972\\', '*.log')
16. It-developer 26 19.09.12 14:36 Сейчас в теме
(15)
Тоже ошибка
Msg 208, Level 16, State 1, Line 1
Invalid object name 'test2.dbo.parselog'.
17. squad 181 19.09.12 14:43 Сейчас в теме
В свойствах сборки (на сборке - правой кнопкой Properties),
General - Permission Set что указано ?
18. It-developer 26 19.09.12 14:47 Сейчас в теме
19. It-developer 26 20.09.12 16:16 Сейчас в теме
Не знаете что еще может быть?
20. squad 181 21.09.12 07:26 Сейчас в теме
Попробуйте создать новую пустую базу данных и погрузить сборку в неё.
Этим покрайней мере исключим возможные проблемы с нехваткой прав на существующей БД и проблемами при погружении сборки в неё.
21. It-developer 26 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 181 24.09.12 10:49 Сейчас в теме
Я чего-то не пойму, вы описали функцию которая выбирает записи из таблицы TechJournal ?
Что кроме содержимого TechJournal может вернуть вам эта функция ?
23. zels 172 30.08.16 11:59 Сейчас в теме
Что означает фраза (сборка с VS2010)
10. Выберите Build > Deploy (yourProjectName). Этим вы погрузите ваш класс и все его функции в базу данных, которую указали в п. 3

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

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

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