Существует несколько хороших статей про регулярные выражения.
https://its.1c.ru/db/metod8dev#content:5927:hdoc (Статья на ИТС недавно обновилась)
Постараюсь написать проще и подробнее - как для себя. Для начинающих, которые уже прочитали Джеффри Фридл "Регулярные выражения" или Бен Форта "Регулярные выражения 10 минут на урок" и установили Cygwin64 GitBash с ресурса https://git-scm.com/download/win.
Предупреждение 1. При копировании примеров из статьи в bash могут возникнуть проблемы. Из-за этого выходит сообщение «Binary file (standard input) matches». Поэтому текстовые файлы примеров команд и фрагмент журнала приложу в архиве. Кто захочет – скачает.
Предупреждение 2. Относитесь к шпаргалке критически, опирайтесь на свои собственные знания.
Скрипт обработки ТЖ сильно зависит от настроек. Универсальных скриптов не бывает. Поэтому пара слов про ТЖ.
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="F:\me_log" history="1">
<event>
<eq property="name" value="SDBL"/>
<ge property="durationus" value="10000" />
</event>
<event>
<eq property="name" value="DBMSSQL"/>
<ge property="durationus" value="10000" />
</event>
<event>
<eq property="name" value="TLOCK" />
<ge property="durationus" value="10000" />
</event>
<event>
<eq property="name" value="TDEADLOCK" />
</event>
<event>
<eq property="name" value="TTIMEOUT" />
</event>
<event>
<eq property="name" value="EXCP" />
</event>
<event>
<eq property="name" value="EXCPCNTX" />
</event>
<event>
<eq property="name" value="ATTN" />
</event>
<event>
<eq property="name" value="ADMIN" />
</event>
<event>
<eq property="name" value="PROC" />
</event>
<event>
<eq property="name" value="QERR" />
</event>
<property name="all"/>
</log>
</config>
Длительность более 10 миллисекунд позволяет отсечь служебные запросы. Пользовательские запросы дольше. Данные журнала накапливаются за од ин час. Это лучшая настройка поскольку собирать журнал можно только на диске сервера (если использовать сетевой диск – возможны дикие тормоза), а место на диске сервера очень дорогое. Чтобы собирать журнал с нескольких серверов на свой рабочий компьютер, ежечасно запускайте помощью Планировщик заданий Windows командный файл *.bat, пример содержимого:
xcopy \\SERVERName1\F\*.* D:\$log$\*.* /S /E /Y
xcopy \\SERVERName2\F\*.* D:\$log$\*.* /S /E /Y
- 29:46.696046-0,TDEADLOCK,5,process=rphost,p:processName=usta83,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,DeadlockConnectionIntersections='6520 6171 AccumRg10307.DIMS Exclusive Fld10308=44:8cbcf07d2b194ea349f50188353e0a15 Fld10309=32:80bb000c293fb1b711e5cef51b92cf25 Fld10310=57:00000000000000000000000000000000 Fld10311=43:00000000000000000000000000000000 Fld10312=26:a79841ebe5e5b977449b6bced05404a0 Fld14461=T"00010101000000" Period=[T"20180401000000":+] Splitter=0,6171 6520 AccumRg14634.DIMS Exclusive Fld14635=36:a6dd730200444a924ac2678a8dbc1d94 Fld14636=12769:81220050569d8ce111e83355b8b20514 Fld14637=5258:8ff9005056a64eb811e04ef8da348a00 Fld14709=14708:b6066bbf8cff66a84e2abceaf4843666 Fld15645=32:80bb000c293fb1b711e5cef51b92cf25 Period=[T"20180401000000":+]',Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'
- 29:46.696047-0,EXCP,5,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,Exception=DataBaseException,Descr='Конфликт блокировок при выполнении транзакции:Неустранимый конфликт блокировок',Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'
- 29:46.712000-15947,DBMSSQL,4,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,Trans=1,dbpid=84,Sql=ROLLBACK TRANSACTION,Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'
- 29:46.727000-14975,DBMSSQL,4,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,Trans=1,dbpid=84,Sql=TRUNCATE TABLE #tt28,Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'
- 29:46.727011-186991,SDBL,3,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,Trans=0,Func=Transaction,Func=RollbackTransaction,Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'
- 29:46.727019-125006,TLOCK,4,process=rphost,p:processName=processName,t:clientID=4710,t:applicationName=1CV8,t:computerName=u41,t:connectID=6171,SessionID=51722,Usr=.Регламентные задания,Regions=AccumRg14634.DIMS,Locks='AccumRg14634.DIMS Exclusive Period=[T"20180401000000":+] Fld14635=36:a6dd730200444a924ac2678a8dbc1d94 Fld14636=12769:81220050569d8ce111e83355b8b20514 Fld14637=5258:8ff9005056a64eb811e04ef8da348a00 Fld14709=14708:b6066bbf8cff66a84e2abceaf4843666 Fld15645=32:80bb000c293fb1b711e5cef51b92cf25',WaitConnections=6520,connectionID=57129e57-8db8-44b8-8df6-7d2d66053bc7,Context='
- ОбщийМодуль.МойНаСервере.Модуль : 36 : ДокОбъект.ЗаписатьИПровестиДокумент(РежимПроведенияДокумента.Оперативный,ТекущийПользователь,Отказ);
- Документ.РеализацияТоваровУслуг.МодульОбъекта : 21548 : МойНаСервере.ПровестиДокументНаСервере(Ссылка, РежимПроведения, ТекущийПользователь, тбзСообщений, Отказ);
- ОбщийМодуль.МойНаСервере.Модуль : 59 : текДокументОбъект.ОбработкаПроведения(Отказ, РежимПроведения);
- Документ.РеализацияТоваровУслуг.МодульОбъекта : 20549 : ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);
- ОбщийМодуль.ПроведениеСервер.Модуль : 184 : Объект.Движения.Записать();'
- 29:46.759001-15892,SCALL,2,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,ClientID=4886,Interface=7931ae5c-5df1-463c-a53a-8e62bf74d068,IName=IExtNotify,Method=7,CallID=12886186,MName=onCommitTransaction,Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 167 : ДокументОбъект = Выборка.Документ.ПолучитьОбъект();'
- 29:46.821000-15907,SCALL,4,process=rphost,p:processName=processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName=Server,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,ClientID=5005,Interface=7931ae5c-5df1-463c-a53a-8e62bf74d068,IName=IExtNotify,Method=6,CallID=12886204,MName=onBeginTransaction,Context='
- ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений.МойРегистр.ПерепровестиДокументы(ПорцияДляПерепроведения);
- РегистрСведений.МойРегистр.МодульМенеджера : 200 : ОбработатьВыполняемоеДействие(Выборка, ВыполняемоеДействие, ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 276 : ПересчитатьБонусы(ДокументОбъект, ДокументСсылка, ПерепроведениеСледует);
- РегистрСведений.МойРегистр.МодульМенеджера : 330 : обДокумент.Записать();'
Задача 1. Подсчитать количество дедлоков (управляемые блокировки) за ночь с 00 по 06 часов
Выбираем содержимое файлов из подкаталогов текущего каталога cat rphost*/ *0[0-6].log |
|
Символы |
Значение |
|
rphost |
Используем, что дедлок содержится только в логах rphost. Выбрать все файлы проще: cat */*.log |
|
* |
любое количество символов в имени файла. Вообще, любое количество символов в регулярных выражениях означается «.*», но создателей команды cat это не смущает. |
|
/ |
Спуск к подкаталогам. Я бы удивился, если бы увидел привычный «\». |
|
0[0-6] |
Числа 00, 01,02,03,04,05,06. На каждый час создается свой файл |
|
.log |
Точка здесь означает точку. Расширение файла – log. |
|
| |
Нам всем привычны временные таблицы. Чтобы поместить результат запроса в аналог временной таблицы, ставим знак «|» (pipe, труба). Следующая команда использует этот результат. |
Почти каждый запрос начинается с команды cat.
Чтобы выбрать строки, содержащие дедлок, нужно составить шаблон. Смотрим строка 1 файла ТЖ, записываем ^[0-9][0-9]:.{10,20}DEADLOCK.
|
Символы |
Значение |
|
^ |
Начало строки |
|
[0-9] |
один цифровой символ |
|
: |
двоеточие |
|
Вступайте в нашу телеграмм-группу Инфостарт Bash регулярные выражения Виктор Богачев Эксперт подготовка экзамен технологический журнал grep egrep awk gawk cat sed print printf echo sort Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
См. такжеHighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free) Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам. 10.11.2025 13593 ivanov660 48 HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free) Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо. 18.02.2025 14707 ivanov660 39 HighLoad оптимизация Системный администратор Программист 1C:ERP Бесплатно (free) Не всегда индексирование с дополнительным упорядочиванием полезно. 04.02.2025 13252 ivanov660 21 HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free) Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL. 24.06.2024 17224 ivanov660 13 HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free) Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник. 06.06.2024 23299 Evg-Lylyk 73 Технологический журнал Программист 1С:Предприятие 8 Бесплатно (free) Шпаргалка по настройке технологического журнала. 27.04.2024 67170 kuzyara 9 HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free) Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы. 13.03.2024 13115 spyke 29 HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free) Оказывается, в типовых конфигурациях 1С есть, что улучшить! 13.03.2024 16040 vasilev2015 22 Комментарии
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
2.
vasilev2015
2860
01.05.18 09:12
Сейчас в теме
(1) Здравствуйте, Сергей ! Когда я смотрел другие статьи про регулярные выражения, где упор делается на использование perl, у меня возникал тот же вопрос. Постарался упростить ))).
Регулярные выражения примечательны тем, что позволяют парсить файлы технологического журнала общим объемом порядка 100 Гигабайт за время порядка 5 минут. Других таких инструментов нет. ЦУП медленнее на порядки. P.S. Пользуюсь инструментами разработчика каждый день. Спасибо Вам.
(2) Кажется обычно более разумно настроить фильтр записи журнала (logcfg.xml), чтобы он собирал то, что нужно. А не собирать в 10-100 раз больше логовов, чем нужно, неоправдано нагружая сервер и вынуждая себя пользоваться в разы менее удобными инструментами. В анализе техножурнала (ИР) непосредственно при чтении логов сейчас доступен только отбор по дате и он уже в большинстве случаев в разы ускоряет загрузку логов. Планирую туда же добавить фильтр по типу события (на этапе чтения). Он позволит еще ускорить логов в ряде случаев. Но конечно с выборкой описанной в статье анализ техножурнала (ИР) не сравнится по скорости.
4.
vasilev2015
2860
01.05.18 13:26
Сейчас в теме
(3) Да, согласен. Поэтому позиционирую статью не как инструменты парсинга ТЖ, а как шпаргалку к экзамену. С нетерпением ждем улучшений ИР. :-))
5.
palsergeich
01.05.18 20:37
Сейчас в теме
(3)
(2) Кажется обычно более разумно настроить фильтр записи журнала (logcfg.xml), чтобы он собирал то, что нужно. А не собирать в 10-100 раз больше логовов, чем нужно, неоправдано нагружая сервер и вынуждая себя пользоваться в разы менее удобными инструментами. В анализе техножурнала (ИР) непосредственно при чтении логов сейчас доступен только отбор по дате и он уже в большинстве случаев в разы ускоряет загрузку логов. Планирую туда же добавить фильтр по типу события (на этапе чтения). Он позволит еще ускорить логов в ряде случаев. Но конечно с выборкой описанной в статье анализ техножурнала (ИР) не сравнится по скорости.
Иногда, особенно когда не знаешь почему все работает медленно, надо собрать всё, убрать главные проблемы, и после этого уже работать с ограниченным ТЖ. Ваш инструмент, я пользовался в том числе и им, в нем действительно удобно сводить данные, но для первичного анализа - regex, ибо в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает, а клеить анализ за каждые 5 минут - не вариант. Очень простой пример. На прошлой неделе разбирал один ТЖ, там, помимо тех проблем о которых я догадывался, за час из сервера приложений было больше полумиллиона вызовов НайтиПоКоду в цикле в регламентном задании. С фильтром на длительность эту проблему обнаружить не удастся. НайтиПоКоду вынесен за цикл, стало сразу лучше.
(5) Частые и одновременно легкие запросы, создающие в сумме большую нагрузку, эффективнее всего ловить через новый инструмент "Статистика запросов MSSQL", который использует не требующую включения и не создающую нагрузки статистику по запросам из процедурного кэша MSSQL. После обнаружения такого запроса в статистике MSSQL человек уже настраивает фильтр в техножурнале по тексту оператора SQL (имеется соответствующая команда в окне "Конвертор текста СУБД") и далее анализирует собранный техножурнал для выявления отправляющих этот запрос контекстов встроенного языка. Сразу через техножурнал выявлять такие запросы в разы менее непродуктивно.
(8)
Статистика
Инструмент "Статистика по запросам MSSQL" появился в последней выпущенной версии и пока не имеет страницы с описанием. Она появится в ближайшее время. Как искать инструмент по названию, показано на картинке Прикрепленные файлы:
(12) Извините за оффтоп, но раз уж тут пошла речь...
Если в конфигурацию не встроена обработка ирАнализТехноЖурнала - отчет сбора статистики не запускается. Имею ввиду из портативной версии ИР. Пришлось найти все вхождения и закомментить: ПриКомпоновкеРезультата( ...... АнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
(5)
в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает
1. Для предотвращения вылетов в 32-разрядном приложении можно использовать ограничитель по количеству загружаемых событий. 2. Можно использовать 64-разрядное клиентское приложение, где такой проблемы, полагаю, не должно быть (не проверял тщательно).
10.
palsergeich
02.05.18 13:41
Сейчас в теме
(7)
в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает
1. Для предотвращения вылетов в 32-разрядном приложении можно использовать ограничитель по количеству загружаемых событий. 2. Можно использовать 64-разрядное клиентское приложение, где такой проблемы, полагаю, не должно быть (не проверял тщательно). 1) Знаю, но даже 500 000 это мало. Пример совершенно реальной проблемы - я привел выше, можно бесконечно сидеть и делать оптимизацию в запросах дольше 0.1 секунды (чем ранее коллеги и занимались) пытаться оптимизировать, а толку будет мало. 2) Версию клиента посмотрю, может быть и правда проблема была в версии клиента у меня и x86 и x64 стоят, спасибо за наводку.
14.
sanjakaiser
03.05.18 12:21
Сейчас в теме
Еще по этой теме есть вебинар на три часа от Виктора Богачева (экзаменатор, принимающий Эксперта). Гуглить например так: регулярные выражения Богачев
15.
starik-2005
3300
03.05.18 12:32
Сейчас в теме
(0)
Вообще, любое количество символов в регулярных выражениях означается «.*», но создателей команды cat это не смущает. Ну тут автор попутал и шаблон регулярного выражения. Автор, не нужно путать эти два в общем-то неодинаковых по синтаксису "языка".
[0-9][0-9]:.{15,20} Ну как вариант, хотя, конечно, "\d{2}:.{,20}" на мой взгляд выглядит лаконичнее и нагляднее, да и вообще я сомневаюсь, что "{15,20}" даже в обрезанном варианте здесь нужно - достаточно использовать нежадный модификатор.
Если бы я не знал, что такое регулярные выражения, то вряд ли я с помощью данной статьи в них смог бы разобраться. Да, это очень простой и эффективный инструмент, просто необходимо разобраться в его элементах с несколькими кейсами. В этой статье кейсы есть, а теоретической части нет (да, она, конечно, выходит за рамки статьи, но т.к. занимает мало, то могли бы и включить). По-сути, регулярные выражения очень хорошо позволяют извлекать текст из текста и модифицировать текст, что зачастую даже важнее поиска (по поводу простого сравнения с шаблоном по регулярке, то в 1С есть механизм XDTO, который может с этим справиться на любой поддерживаемой ОС ). А вот менять он не умеет. При том простой кейс замены даты, выгруженной в обычном формате 1С (ДД-ММ-ГГГГ чч:мм) можно поменять на XML-формат (YYYY-MM-DD) с помощью групп вот таким образом: Шаблон поиска: >(\d\d).(\d\d).(\d{4})( \d\d:\d\d)<Шаблон замены: >\3-\2-\1<Т.е. определяются группы (то. что в скобках). Дальше эти группы по номеру используются в шаблоне замены, в итоге сначала выводится 3-я группа с годом, потом вторая, потом первая. Таких шаблончиков разобрать штук десять - и все, регулярки освоены. Дальше можно делать с ними все на свете.
17.
vasilev2015
2860
03.05.18 12:46
Сейчас в теме
(15) Про регулярные выражения лучше прочитать в книге Джеффри Фридла «Регулярные выражения». В статье - приложение на практике, приближенное к экзамену.
18.
starik-2005
3300
03.05.18 12:52
Сейчас в теме
(17)
Про регулярные выражения лучше прочитать в книге Вы читали в книге? Как оно там? Сколько страничек? Если читали, то зачем пишите "[0-9]" вместо "\d"?
На мой взгляд, сначала лучше в ВИКИ читнуть, поиграться с notepad++, потом с grep (кстати, никогда не юзал egrep - чем он отличается?), потом с sed. В итоге за пару дней освоится основной функционал, которого уже будет для большинства задач за глаза. А дальше, если хочется стать экспертом не только в 1С, а еще и в регулярных выражениях, можно перейти к книгам (но я бы, лично, из книг порекомендовал "", а то все хотят стать экспертами, а зачем - не знают )))
19.
vasilev2015
2860
03.05.18 12:59
Сейчас в теме
(18) да, читал. Использую [0-9] вместо "\d" поскольку [0-9] работает там, где иногда не работает "\d". Egrep равносилен grep с ключом -e. Экспертом хочу стать по-приколу: могу себе позволить.
20.
starik-2005
3300
03.05.18 16:17
Сейчас в теме
(19) в вики написано, что это одно и то же, только синтаксис регулярок упрощен, а для полного нужно заэкранировать спецсимволы.
Интересно стало, где "[0-9]" работает, а "\d" - нет... Сходу не смог ничего такого придумать. Подскажете?
(20) Насколько я помню \d не является метасимволом в posix, только в pcre. Шанс нарваться сегодня на утилиту, не умеющую pcre довольно мал.
За написание [0-9] вместо \d есть большой аргумент: удобочитаемость. Регулярки очень сложно читать. Помнить и расшифровывать все метасимволы достаточно неудобно. Использование простого диапазона повышает "понимаемость" регулярки. А так, конечно, разницы в получаемом результате нет
Извиняюсь, но термин "регулярные выражения" - это немного не к журналу регистрации изначально. Это к стыку мат.анализа , теории множеств и азам программирования.
Отдельная тема к экзаменам второго курса ВУЗа. Думается мне, более правильно тема звучала бы "Применение регулярных выражений в решении задач таких-то"
23.
starik-2005
3300
03.05.18 22:28
Сейчас в теме
(22)
За написание [0-9] вместо \d есть большой аргумент: удобочитаемость. Регулярки очень сложно читать. Помнить и расшифровывать все метасимволы достаточно неудобно. Использование простого диапазона повышает "понимаемость" регулярки. А мне, лично, кажется, что короче - в данном конкретном случае лучше. Я тут видел в XBRL ЦБ таких регулярок в шаблоны наклал, что страшно становится. Например, они написали полное выражения для корректного диапазона дат (при том для текстового элемента открытой оси). И вот этот огород в двести символов (а может и больше) определенным образом напрягает. Они там все феврали вырисовали с учетом високосных лет, например. И все это мельтешит через "|" и цифры.
24.
sanjakaiser
04.05.18 07:31
Сейчас в теме
К сожалению, отредактировать предыдущий мой пост уже нельзя, вот видео Богачева
. (Не реклама) Автор дает представление о том, что такое регулярки, почему их надо использовать при анализе ТЖ, ну и на практике показывает, куда это запрягать + Это тот человек, который принимает у вас экзамен 1С:Эксперт
Пользуясь случаем (простите за оффтоп еще раз), раз в ветке отметились мастера разбора ТЖ, хочу посоветоваться...
Есть большая БД, РИБ. Я верно понимаю, что если настраивать ТЖ, то это придется делать во всех узлах и потом выполнять некий сводный анализ? Втом числе, наверное и с помощью регулярок. И еще момент... Мы встроили в конфу БСП и подсистему "Оценка производительности". Планируем выявить самые "нехорошие места" сначала ей, а потом, как мне кажется - можно уже и ТЖ более детально настроить... Может кто-то пользовался подсистемой? Поделитесь впечатлениями, плз.
28.
vasilev2015
2860
04.05.18 12:32
Сейчас в теме
(27) я не очень мастер, но поскольку ветка моя - постараюсь ответить. Если у вас есть планы парсить, проводить анализ и искать узкие места в дочерних базах, то настраивайте там ТЖ. Если нет планов - "впрок" не делайте. Обязательно следите за местом, которое потребляет ТЖ.
Оценка производительности незаменима для общения с заказчиком: у вас апдекс был 0,6 а теперь 0,85 - извольте заплатить. Для себя апдекс тоже интересен: смотреть, что операторы проводят заказы по 59 секунд и удивляться их терпению. Или постфактум обосновать полезность приобретения нового raid. Менеджеры привыкли верить цифрам и красивым графикам.
я конечно понимаю что регулярные выражения это просто - но точно не для 1С-ников. А вот ниже регулярки уже для них.
#Использовать verbal-expressions
// Проверим корректность формирования URL. Допустимые схемы - http[s] и ftp
ЭкранироватьПереданноеЗначение = Ложь;
ВербальноеВыражение = Новый ВербальноеВыражение()
.НачалоСтроки()
.Затем(
Новый ВербальноеВыражение()
.Найти("http")
.МожетБыть("s")
.Либо("ftp")
.ВСтроку(),
ЭкранироватьПереданноеЗначение
)
.Затем("://")
.ЧтоНибудьНоНе(" ")
.КонецСтроки();
ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
Сообщить(ТекстРегулярногоВыражения);
ПоказатьP.S. а вы никогда не задумывались над тем почему вместо изучения регулярок и сдачи их на экзамене просто не поменять формат журнала технологического. Сюрррреализм.
31.
starik-2005
3300
06.05.18 13:57
Сейчас в теме
(30)
P.S. а вы никогда не задумывались над тем почему вместо изучения регулярок и сдачи их на экзамене просто не поменять формат журнала технологического. Сюрррреализм. А какой формат ТЖ поможет сделать его анализ без поиска текста? Даже интересно стало...
(31)Возможно, в формате JSON или YAML (как это сейчас достаточно популярно в других системах, формирующих логи - в основном в WEB; да и готовых шин данных и парсеров логов в в таком формате уже создано полно) - когда за парсинг строки будет отвечать уже встроенная библиотека разбора данного формата. Хотя это не отменяет того, что уже в разобранных "сообщениях" не нужно делать поиск по регуляркам в их полях. Ну даже если не по регуляркам - то просто на поиск по ключу(ам) для наложения фильтров отбора и ветвления. Впрочем, такой поиск уже куда проще описать даже с регулярками, чем парсить исходные строки Т/Ж. Но, скорость, разбора тут конечно немного снизится (из за нескольких прогонов одного и того же текста; не знаю насколько существенно - если не рассматривать алгоритм разбора на 1С - на 1С то явно заметно просядет).
Хотя я, вот, не считаю такое проседание производительности существенным недостатком. Ибо - разово можно и подождать. А для регулярной массовой обработки - лучше перейти на применение "специализированных" инструментов обработки больших объёмов текстовых данных - от ElasticSearch до, скажем, Яндекс ClickHouse (да даже MS SQLServer или PostgreSQL тут подойдут - если объёмы исходных данных не измеряются терабайтами в месяц) - куда логи проще загнать целиком - и уже там запросами их анализировать - особенно учитывая что загонять можно в реальном времени или в условно нерабочее время - о того скорость их парсинга не будет существенной. А вот анализировать будет куда удобнее и быстрее запросами (в расширенных диалектах этих СУБД), чем регулярными выражениями P.S. Прошу прощения за то, что написал этот ответ спустя 2 года после сообщения - я просветился за это время ;-) Тем более никто так и не ответил ранее :-( а статью эту сейчас подняли из небытия и её снова читают
33.
starik-2005
3300
10.04.20 11:45
Сейчас в теме
(32) я про JSON на прошлой неделе (если не на этой) писал, что было бы не плохо, ибо: Elastic, jsonb postgres, ...
С другой стороны, сейчас ТЖ - 'это CSV, а для него есть уже кем-то написанные утилиты, которые преобразуют CSV в JSON. С третьей стороны, есть мнение, что ТЖ - информация эфемерная, которую не нужно хранить постоянно, ибо завтра код поменялся и производительность просела в другом месте. Хранить это нет никакого смысла после того, как произведен анализ, а уж после найденного решения и подавно. Поэтому нужен формат, который бы максимально просто подвергался исследованию, а тут CSV уже действительно без всех этих парсеров на awk со сложной для обычного админа структурой слабо подходит для исследования.
(33)Да - самописные инструменты парсинга и преобразования текущего формата Т/Ж есть - я не спорю, просто это всё лишнее время на конвертацию, посему и написал, что не вижу в этом проблем по производительности - на больших объёмах куда важнее наладить эффективный сбор и консолидацию логов (и их эффективное хранение) - чем чахнуть над повышением эффективности парсинга и сложных регулярках. Вот только на экзамене по эксперту пока ещё требуют чтобы испытуемые непременно умели чахнуть над регулярками. Впрочем, изучить их конечно надо. Как и некоторые юниксовые утилиты - перекачевавшие и в windows по разбору текстовых файлов. И это действительно может быть полезно при выездном анализе производительности такими специалистами. Но к реальной стационарной практике анализа Т/Ж это имеет мало общего. Тут применяются совсем иные инструменты. Куда лучше - запихнуть лог в СУБД разными готовыми утилитами (ну или анализировать его налету запросами а-ля SQL при помощи, так же, имеющихся самописных утилит), чем парсить его сложными регулярками (учитывая что формат лога Т/Ж к парсингу регулярками не особо благоволит).
Но всё же, мировая тенденция сейчас - это формирование логово в формате JSON (тенденция не значит правило), и хорошо было бы компании 1С всё-таки добавить поддержку этого формата тоже (пусть в cfg файле бы это настраивалось - CSV или JSON, JSONB, YAML), а если бы ещё можно было бы настроить сразу трансляцию в сервис (WEB, HTTP, в т.ч. c указанием формата преобразования исходного сообщения - ну это я про возможности FileBeat намекаю только со встроенной поддержкой в платформу) или в БД (по заданной настройке подключения и формату запроса на вставку) - то вообще было бы очень круто! Ну и стыдно должно быть - когда в продукте до сих пор нет встроенного средства хотя бы примитивного разбора а и анализа логов Т/Ж - для как раз выездных случаев разбора специалистами - когда нет возможности поднять более мощную инфраструктуру по их разбору и анализу во внешних программах (в том числе, упомянутых мной выше). А по поводу хранения - зачастую даже в изменчивой природе конфигураций и, как следствие, данных в логах, имеет смысл хранить логи некоторое время - чтобы иметь возможность делать кросс-анализ (как было и как стало). Да и в крупных компаниях даже за сутки объёмы логово могут быть достаточно велики - чтобы сразу направлять их в условно "колоночную" СУБД, чтобы сократить занимаемое ими место и повысить скорость анализа. Ну и зачастую, лучше писать в логи информации побольше (подетальнее) - чтобы было что потом анализировать (пусть это и снижает производительность сервера 1С - SSD тут в помощь). Просто делать это можно лишь периодически, хотя можно и постоянно - это уже зависит от того, как грамотно этими логами смогут потом распорядиться специалисты
35.
starik-2005
3300
10.04.20 13:57
Сейчас в теме
(34) Про JSON я тут как раз не спорю, а идея передавать это сразу чем-нибудь через HTTP - просто бомба, ибо сэкономила бы кучу времени и средств для доставки данных в целевую систему анализа.
С другой стороны, у 1С есть тот же APDEX, который бы уже давно нужно встроить в платформу, чтобы она сама эту информацию о времени записи документа, открытии формы, проведении и прочем - фактически выбранным событиям - записывала в идеале в очередь или куда там (с настраиваемым интерфейсом). Я даже на С/Питоне/Прочем когда разрабатываю приложения, то периодически озабочиваюсь регистрацией времени для тех или иных вызовов (хотя там, слава богу, с профилированием и утилитами для этого и так проблем нет). И вот исходя из показателей APDEX следует в идеале запускать механизм мониторинга в автоматическом режиме, дальше уже собирается ТЖ для соответствующих объектов, по которым произошла просадка APDEX, и уже готовый отчет с первичным анализом должен прилететь на хелп-деск или куда там процесс маршрутизирован в организации. Ну и, вообще в идеале, к нему должны цепляться данные о графике регламентных работ, которые производятся в интервал просадки, если они есть. А чтобы были именно они, то все регламенты должны быть "бюрократически" согласованы и акцептованы у всех ключевых стейкхолдеров.
Регулярные выражение это отлично, но не в этом сложность ИМХО. Их достаточно легко освоить. Проблема в другом в "№;*;%:№;ом количестве параметров для команд perl, sed, grep, awk. Мало того, эти параметры различаются в bash Linux и MIGW64. Да и синтаксис grep не совсем соответствует спецификации регулярки в Википедии. Например у меня было не понимание - зачем соединять строки в одну чтобы искать то что нужно? Ведь есть модификатор (?s) Оказывается, ни в одном варианте grep или egrep этот модификатор не поддерживается. Ну и в чистом виде поиска и вытаскивания выражений в скобках (some expression) и подстановка их в другой шаблон как в notepad++ нет ни в одной из перечисленных команд выше. Авторы Морозов и другие зачем то предлагают заменять переносы строк через perl, хотя достаточно tr. А и ещё... \w+ для русских идентификаторов не работает. НИКОГДА. Только [А-Яа-я]{1,}. В общем даже зная регулярки по спецификации как в википедии (наиболее полно реализованы в notepad++ и, спасибо разработчикам Эклипса в EDT НО \w+ тоже не пашет в EDT).
И каждый раз набрав регулярное выражение вспоминаю стишок. Стою на асфальте я в лыжи обутый То ли лыжи не едут, то ли я ?*%;*№*тый Есть и ещё один важный момент. Я начал плотно работать с регулярными выражениями не так давно - года 3-4 назад. Вот эти последовательности cat rphost*/*.log | perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | perl -pe 's/\xef\xbb\xbf//g' | grep -P "SDBL.*Func=(Commit|Rollback)Transaction.*Context" | perl -pe 's/^\d+:\d+.\d+-//g' | perl -pe 's/,SDBL,.*Context.*<line>[ \t]+/,Context=/g' | perl -pe 's/,SDBL,.*Context=/,Context=/g' | sed 's/<line>//g' | head - бесполезно заучивать если у вас нет записной книжки под рукой. Моск не дом советов. Мой не запоминает. Проще коран выучить не зная арабского. Только понимание каждой из команд и ежедневное использование позволят "с лёгкостью" пропарсить ТЖ. Заметил - 3 дня не использовал и уже забыл опции для perl чтобы заменить шило на мыло, вот не помню чтоб поставить между perl и 's/мыло/шило/g'. И начинается: --help а дальше почти перебор. Потому что букв две: -pe.
38.
vasilev2015
2860
11.04.20 23:07
Сейчас в теме
(37) Здравствуйте !
у меня в общем, такие же ощущения, поэтому я хочу создать библиотеку скриптов Bash для парсинга ТЖ. И закрыть этот вопрос. Посмотрите пожалуйста другие мои статьи, например . Буду рад любой конструктивной критике.
(38) Николай, я не сколько не сомневаюсь что готовые фрагменты анализа ТЖ за$bash'енные в своё время и опубликованные здесь - реально круты :) Но, Саша (М) говорил так. Прихали на секретный завод. Интернета нет. Телефон отобрали на входе. Нет ничего, ТЖ, голые руки - и bash. Вот как хочешь - так и $bash :). Поэтому всё что выше было - это не критика, а лишь призыв к пониманию, что если не будет доступа к копипасту - выручат лишь глубокие знания и понимания команд bash. Статьи посмотрел, они будут полезны при самостоятельном разборе, чтобы в голове отложилось "что вот ещё так можно" но заучивать и копипастить их, увы, будет бесполезно (по крайней мере для меня). У меня был случай (года 2 назад), который описывал Александр М. У меня был телефон, и о чудо даже работал интернет на нём! Я раз 5 перебивал строчки с мобилы на клаве компа. И всё безнадёжно - не вероятно неудобно, я терял строку, ошибался. Только понимание, только хардкор.
Забавная вещь (точно присутствует на платформе 8.3.13.1644)
Объектное чтение Для документа: SELECT ID,Version,Marked,Date_Time,NumberPrefix,Number,Posted, Для справочника: SELECT ID, Version, Marked, PredefinedID, ParentID, Code, Description, Обратите внимание на наличие пробелов ))) в документе первые поля идут без пробелов, а в справочнике - с пробелами! Возможно в других объектах тоже присутствуют подобные артефакты. Будьте внимательны при установке фильтров в logcfg.xml и разборе ТЖ Автор:
Подписаться
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора. Публикация:
№ 825405 Создание 30.04.18 23:37 Обновление 11.04.20 11:37 Статистика:
Просмотры 31852 Загрузки 3
Рейтинг
129 Комментарии 39 Характеристики:
Код открыт Да Рубрики HighLoad оптимизация Технологический журнал Кому Программист Тип файла Нет файла Платформа 1С:Предприятие 8 Конфигурация Универсальные Операционная система Не имеет значения Страна Россия Отрасль Не имеет значения Налоги Не имеет значения Вид учета Не имеет значения Доступ к файлу Бесплатно (free) |