Работа с технологическим журналом (ТЖ) — это одна из ключевых компетенций эксперта по технологическим вопросам. Логи 1С могут достигать гигантских размеров, и ручной анализ таких файлов невозможен. В данной статье мы проанализируем ситуацию, когда необходимо быстро и эффективно обрабатывать текст ТЖ в условиях ограниченных инструментов (например, на экзамене или на «голом» сервере Linux), используя perl и sed.
Часто в статьях на ИТС можно встретить сложные конструкции, объединяющие несколько команд через символ вертикальной черты |. Давайте выясним причину такой структуры. Этот символ называется «пайп» (pipe), и он передает результат работы одной программы на вход другой.
Рассмотрим пример классической очистки лога от специфических данных для группировки:
cat file | sed -r 's/.{8}-.{4}-.{4}-.{4}-.{12}/{GUID}/g' | sed -r 's/\:[0-9]{4,5}/{PORT}/g' | sed -r 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{ADDR}/g'
Проанализируем по шагам, что происходит в этой цепочке:
cat file считывает содержимое файла и отправляет его в поток.sed -r ищет последовательности, похожие на GUID (например, 5927-hdoc...), и заменяет их на текст {GUID}. Флаг g означает «глобально», то есть во всей строке.sed принимает уже измененный текст и ищет в нем номера портов (двоеточие и 4-5 цифр), заменяя их на {PORT}.sed находит IP-адреса и заменяет их на {ADDR}.В результате мы получаем «обезличенный» лог, который гораздо проще анализировать и группировать, так как уникальные идентификаторы больше не мешают находить повторяющиеся события.
Многие авторы считают использование perl более удобным, чем sed. Разберем, что означает конструкция perl -pe 's/найти/заменить/'. Это так называемый «one-liner» — полноценная программа на языке Perl, умещающаяся в одну строку.
Рассмотрим подробнее используемые ключи:
$_, выполнять над ней код (например, замену) и автоматически выводить результат в консоль.Таким образом, perl -pe работает как продвинутый sed, но предоставляет гораздо больше возможностей для сложной логики.
Почему для анализа ТЖ мы выбираем именно Perl? Выясним причину: регулярные выражения в Perl (PCRE) намного мощнее тех, что используются в базовом sed или grep. В Perl мы можем использовать:
DBMSSQL, где длительность превышает 1 секунду.Давайте разберем по шагам, как можно не просто заменять текст, но и анализировать данные. Если нам нужно просуммировать время всех событий в логе, мы можем использовать флаг -n (который похож на -p, но не печатает строки автоматически) и блок END.
Посмотрим на пример команды для суммирования длительности (второе поле в ТЖ):
perl -F',' -ane '$total += $F[1]; END { print "Общее время: " . $total/1000000 . " сек\n" }' logs.log
В этом примере:
-F',' — устанавливает запятую в качестве разделителя полей (как в CSV).-a (autosplit) — автоматически разбивает строку в массив @F.$F[1] — обращается ко второму полю (длительность в микросекундах).END выполняется один раз после обработки всего файла.Технологический журнал 1С коварен: SQL-запросы или планы выполнения могут занимать десятки строк. Обычные утилиты, работающие построчно, «сломаются» на таком событии. В Perl мы можем изменить разделитель записей.
Проанализируем ситуацию: каждое новое событие в ТЖ начинается с метки времени (например, 12:00.0000-0). Мы можем сказать Perl считывать файл не до символа переноса строки, а до следующей метки времени.
perl -0777 -ne 'while (/(\d{2}:\d{2}\.\d+-\d+,DBMSSQL,.*?,Context=(.*?)\n)/gs) { print "Длительный контекст: $2\n" }' log.log
Здесь флаг -0777 заставляет Perl считать весь файл целиком в память (будьте осторожны с очень большими файлами!), что позволяет искать регулярным выражением текст, содержащий переносы строк.
Если вы работаете не в консоли сервера, а внутри самой платформы 1С, стоит помнить, что начиная с версии 8.3.24, в платформе появилась встроенная поддержка регулярных выражений. Теперь мы можем решать задачи парсинга прямо в коде 1С, используя объект РегулярныеВыражения.
Посмотрим на пример кода:
РегВыр = Новый РегулярныеВыражения();
Результат = РегВыр.Найти(ТекстЛога, "\d{2}:\d{2}\.\d+-\d+,(\w+)");
Для Каждого Совпадение Из Результат Цикл
Сообщить("Найдено событие: " + Совпадение.Группы[0].Значение);
КонецЦикла;
Однако на экзамене «1С:Эксперт» вам, скорее всего, придется работать с «голой» операционной системой, поэтому навыки владения perl и sed остаются критически важными.
Чтобы не запутаться в экранировании символов (например, когда нужно найти двоеточие или обратный слэш), мы рекомендуем использовать специализированные сервисы. Одним из лучших является regex101.
При работе с ним важно:
Мы рассмотрели основные подходы к анализу ТЖ через Perl. Подытожим наши выводы:
sed для простых замен (GUID, IP, порты), чтобы подготовить данные к группировке.perl -pe, когда вам нужно сочетать замену текста с мощью регулярных выражений Perl.perl -ane.PowerShell и его командлет Select-String, который также поддерживает регулярные выражения.Помните, что Perl — это инструмент, который есть почти на каждом сервере Linux «из коробки», и умение написать на нем одну строку кода может сэкономить вам часы ручного разбора логов при расследовании технологических проблем.