* [devel] I: утилита logoved-report для обработки логов. 1-введение. @ 2018-09-21 17:33 Igor Vlasenko 2018-09-21 17:52 ` Igor Vlasenko 2019-06-25 8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin 0 siblings, 2 replies; 6+ messages in thread From: Igor Vlasenko @ 2018-09-21 17:33 UTC (permalink / raw) To: devel Уважаемые коллеги, Предлагаю вашему вниманию утилиту logoved-report для обработки логов неудавшихся сборок. Принцип работы: утилита создает папку отчета (Уважаемые коллеги, Предлагаю вашему вниманию утилиту logoved-report для обработки логов неудавшихся сборок. Принцип работы: утилита создает папку отчета (./LOGS) с подпапками, внутри которых линки на логи с однотипной ошибкой, полезная статистика, а также входной скрипт для утилиты автопочинки пакетов logoved-batchfix. Это позволяет часть пакетов починить вообще автоматически, а для остальных устроить конвейер: Выбираем подпапку с типом ошибки, которая чинится легче или быстрее всех, скачиваем упомянутые там пакеты или gear репозитории, и правим одним махом спек файлы (с однотипными ошибками не нужно переключать мозг, и есть шанс копипастить решение из одного спека в другой). Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов, (а в будущем, в расчете на то, что база Логовед будет только расти, а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов) а уже на объемах от 100-200 failed лог файлов без нее как без рук. Утилита рассчитана на тех наших героев, которые разбирают beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source) репозиториев Sisyphus, и тех дважды героев, которые смотрят в FTBS бранча, для выпускающих репозитории для дополнительных архитектур, и для делающих NMU/пересборки с большим числом затронутых пакетов. Самым крупным пользователем и активным контрибьютером, естественно, буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи. Я решил сначала выпустить релиз в виде git репозитория, а не в виде пакета в Сизифе. Выложив в Сизиф, пришлось бы слишком часто слать обновления, так как сейчас база в состоянии активного наполнения. Кроме того, пользователям возможно понадобится дополнять базу своими образцами сообщений о проблемах, и внести запись в базу в git под рукой удобнее. Так как данный пост у меня получился слишком длинным, более 20.000 знаков, то для рассылки разбил его на 3 части: * Введение (эта часть) * Установка и работа * Правила Логовед. OGS) с подпапками, внутри которых линки на логи с однотипной ошибкой, полезная статистика, а также входной скрипт для утилиты автопочинки пакетов logoved-batchfix. Это позволяет часть пакетов починить вообще автоматически, а для остальных устроить конвейер: Выбираем подпапку с типом ошибки, которая чинится легче или быстрее всех, скачиваем упомянутые там пакеты или gear репозитории, и правим одним махом спек файлы (с однотипными ошибками не нужно переключать мозг, и есть шанс копипастить решение из одного спека в другой). Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов, (а в будущем, в расчете на то, что база Логовед будет только расти, а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов) а уже на объемах от 100-200 failed лог файлов без нее как без рук. Утилита рассчитана на тех наших героев, которые разбирают beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source) репозиториев Sisyphus, и тех дважды героев, которые смотрят в FTBS бранча, для выпускающих репозитории для дополнительных архитектур, и для делающих NMU/пересборки с большим числом затронутых пакетов. Самым крупным пользователем и активным контрибьютером, естественно, буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи. Я решил сначала выпустить релиз в виде git репозитория, а не в виде пакета в Сизифе. Выложив в Сизиф, пришлось бы слишком часто слать обновления, так как сейчас база в состоянии активного наполнения. Кроме того, пользователям возможно понадобится дополнять базу своими образцами сообщений о проблемах, и внести запись в базу в git под рукой удобнее. Так как данный пост у меня получился слишком длинным, более 20.000 знаков, то для рассылки разбил его на 3 части: * Введение (эта часть) * Установка и работа * Правила Логовед. -- I V ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] I: утилита logoved-report для обработки логов. 1-введение. 2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko @ 2018-09-21 17:52 ` Igor Vlasenko 2018-09-21 17:49 ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko 2019-06-25 8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin 1 sibling, 1 reply; 6+ messages in thread From: Igor Vlasenko @ 2018-09-21 17:52 UTC (permalink / raw) To: devel Опс, сорри, что-то не то в vim нажал :( Пощу еще раз: #===================================== Уважаемые коллеги, Предлагаю вашему вниманию утилиту logoved-report для обработки логов неудавшихся сборок. Принцип работы: утилита создает папку отчета (./LOGS) с подпапками, внутри которых линки на логи с однотипной ошибкой, полезная статистика, а также входной скрипт для утилиты автопочинки пакетов logoved-batchfix. Это позволяет часть пакетов починить вообще автоматически, а для остальных устроить конвейер: Выбираем подпапку с типом ошибки, которая чинится легче или быстрее всех, скачиваем упомянутые там пакеты или gear репозитории, и правим одним махом спек файлы (с однотипными ошибками не нужно переключать мозг, и есть шанс копипастить решение из одного спека в другой). Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов, (а в будущем, в расчете на то, что база Логовед будет только расти, а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов) а уже на объемах от 100-200 failed лог файлов без нее как без рук. Утилита рассчитана на тех наших героев, которые разбирают beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source) репозиториев Sisyphus, и тех дважды героев, которые смотрят в FTBS бранча, для выпускающих репозитории для дополнительных архитектур, и для делающих NMU/пересборки с большим числом затронутых пакетов. Самым крупным пользователем и активным контрибьютером, естественно, буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи. Я решил сначала выпустить релиз в виде git репозитория, а не в виде пакета в Сизифе. Выложив в Сизиф, пришлось бы слишком часто слать обновления, так как сейчас база в состоянии активного наполнения. Кроме того, пользователям возможно понадобится дополнять базу своими образцами сообщений о проблемах, и внести запись в базу в git под рукой удобнее. Так как данный пост у меня получился слишком длинным, более 20.000 знаков, то для рассылки разбил его на 3 части: * Введение (эта часть) * Установка и работа * Правила Логовед. -- I V ^ permalink raw reply [flat|nested] 6+ messages in thread
* [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед. @ 2018-09-21 17:49 ` Igor Vlasenko 2018-09-21 17:34 ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko 2018-09-21 18:38 ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko 0 siblings, 2 replies; 6+ messages in thread From: Igor Vlasenko @ 2018-09-21 17:49 UTC (permalink / raw) To: devel 3. Создание своих правил Логовед. Работая с утилитой logoved-report, вы наверняка столкнетесь с ошибками, которые хотелось бы распознать, но logoved-report о них не знает. Нет проблем - просто создаем свое правило .logoved в ./db/. 3.1 Синтаксис правил Логовед. Для начала посмотрим, как выглядит какое-то простое правило Логовед. $ cat db/sisyphus_check/summary.logoved PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary Мы видим однострочный файл с PATTERN=..., аргумент для PATTERN без кавычек. Легко догадаться, что с таким правилом логовед выполнит некий аналог запуска утилиты pcregrep "$PATTERN" /path/to/logs. Синтаксис текущей версии достаточно прост. #============================================== # допускаются комментарии; # записи имеют вид KEY=VAL # где VAL не берется в кавычки и может содержать пробелы, # где KEY могут повторяться, а допустимые KEY это TYPE= SCOPE= PATTERN= PATTERN_SEQ= MULTILINE_PATTERN_BEGIN= MULTILINE_PATTERN_BODY= MULTILINE_PATTERN_END= DESCRIPTION= STATISTICS= STATISTICS_HEADER= FIX= # после ключевого слова __END__ все остальное игнорируется. __END__ после ключевого слова __END__ может быть фрагмент лог файла для примера. #============================================== Однако с правилом db/sisyphus_check/summary.logoved не все так просто. В каждом правиле Логовед должны присутствовать TYPE= и SCOPE=. Тем не менее, в summary.logoved эти значения явно не указаны. Откуда они берутся? При загрузке базы Логовед используются файлы 00default для установки значений по умолчанию. Для db/sisyphus_check/summary.logoved это файл db/00default, откуда берутся TYPE=error SCOPE=run и файл db/sisyphus_check/00default где SCOPE переопределяется в SCOPE=hasher::sisyphus_check Таким образом, после загрузки, с учетом файлов 00default, внутри программы правило db/sisyphus_check/summary.logoved выглядит как TYPE=error SCOPE=hasher::sisyphus_check PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary но при наличии файлов 00default мы можем писать только PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary остальное придет от файлов 00default как значения по умолчанию. 3.2 Параметры правил Логовед. 3.2.1 Параметр SCOPE. Поговорим сначала о параметре SCOPE. Поиск по всему лог файлу -- плохая идея. Подходящий аналог -- искать макрос в спек-файле и найти его в %changelog. Для лог-файла тоже есть ряд примеров, когда поиск находит совсем не то, что нужно. библиотека Logoved-Stream разбивает на секции hasher::chroot::users hasher::chroot::install hasher::chroot::srpm::repack hasher::chroot::srpm rpmbuild::prep rpmbuild::build rpmbuild::install rpmbuild::install::brp rpmbuild::check rpmbuild::files rpmbuild::files::processing rpmbuild::files::find_requires rpmbuild::files::requires rpmbuild::files::listed_twice rpmbuild::write hasher::time hasher::sisyphus_check beehive::time а в случае ошибок еще возникают секции hasher::chroot::error hasher::chroot::apt hasher::chroot::file_conflict rpmbuild::error Чтобы указать нужную нам область поиска, используется параметр SCOPE. Просто перечислим нужные нам секции с помощью SCOPE. Например, для сообщений в процессе сборки (не для сообщений от от скриптов, входящих в rpmbuild) нам понадобится SCOPE=rpmbuild::prep SCOPE=rpmbuild::build SCOPE=rpmbuild::install SCOPE=rpmbuild::check SCOPE=rpmbuild::error Конечно, такая запись довольно громоздка, даже если ее указывать только в файлах 00default. В Логовед БД в модуле lib/Logoved/DB/Stream/Listener/Factory.pm определены следующие сокращения для наборов секций: apt hasher::chroot::apt hasher::chroot::file_conflict run rpmbuild::prep rpmbuild::build rpmbuild::install rpmbuild::check rpmbuild::error conf rpmbuild::prep rpmbuild::build rpmbuild::error build rpmbuild::prep rpmbuild::build rpmbuild::install rpmbuild::error check rpmbuild::build rpmbuild::install rpmbuild::check rpmbuild::error Также в базе логовед этим сокращениям соответствуют наборы правил (подкаталоги), для которых файл 00default содержит соответствующий SCOPE. db/run - сообщения об ошибке при запуске db/conf - сообщения при конфигурировании, от configure, cmake. db/build - сообщения от компилятора, линковщика, других сборочных утилит db/check - сообщения о неудаче тестирования в db/sisyphus_check/ как мы видели, по умолчанию указан SCOPE=hasher::sisyphus_check Параметры SCOPE= можно себе представить как команды редактирования. Мы удаляем из лог файла все лишнее, оставляя только те секции, которые указаны в SCOPE, и производим поиск в полученном урезанном файле. 3.2.1 Параметры PATTERN* и связанные с ними FIX и STATISTICS. Параметры PATTERN* позволяют указать нам шаблоны поиска. значение - регулярное выражение perl, что значит, что надо экранировать @$%(){}*+, если они используются как простые символы: \@, \$ \%, \(, \), \{, \}, \*, \+ Чтобы упростить регулярные выражения perl, из входящих строк лог файла перед применением регулярных выражений удаляется конец - символ перевода строки "\n". 3.2.1.1 однострочный PATTERN= Самый простой вариант -- однострочный PATTERN= Пример: $ cat db/run/command-not-found/perldoc.logoved PATTERN=perldoc: command not found FIX=buildrequires --add /usr/bin/perldoc В одном правиле можно указать несколько PATTERN, достаточно, чтобы сработал только один из них: $ cat db/apt/E-package-not-found.logoved # E: Couldn't find package libtau-common PATTERN=^E: Couldn't find package (\S+) PATTERN=^E: Невозможно найти пакет (\S+) STATISTICS=%{GROUP:1} STATISTICS_HEADER=E: Невозможно найти пакет: 3.2.1.2 многострочный PATTERN_SEQ= Более сложный - многострочный шаблон PATTERN_SEQ= фиксированной длинны. последовательность PATTERN_SEQ= PATTERN_SEQ= PATTERN_SEQ= совпадает, если 1я строка совпадет с 1м паттерном, 2-я со вторым и т.д. Пример1: $ cat db/conf/automake-version/1.logoved PATTERN_SEQ=you need automake version \S+ or later PATTERN_SEQ=^error: Bad exit status from /\S+ \(\% __END__ ./bootstrap: you need automake version 1.5 or later error: Bad exit status from /usr/src/tmp/rpm-tmp.3287 (%build) Пример2: $ cat db/conf/automake-version/2.logoved PATTERN_SEQ=You must have automake \S+ installed to compile PATTERN_SEQ=Install the appropriate package for your distribution, PATTERN_SEQ=or get the source tarball PATTERN_SEQ=^error: Bad exit status from /\S+ \(\% __END__ You must have automake 1.7.x installed to compile . Install the appropriate package for your distribution, or get the source tarball at http://ftp.gnu.org/gnu/automake/ error: Bad exit status from /usr/src/tmp/rpm-tmp.64887 (%prep) В отличие от PATTERN, в правиле логовед из-за ограничений синтаксиса может быть только одна последовательность PATTERN_SEQ=. Но есть синтаксический сахар. Во flat режиме подпути, состоящие из одних цифр, отбрасываются. Поэтому лог файлы, подпадающие под правила conf/automake-version/1.logoved conf/automake-version/2.logoved в отчете попадут в одну и ту же папку LOGS/conf-automake-version . 3.2.1.3 шаблон MULTILINE_PATTERN_* переменной длинны. многострочный шаблон MULTILINE_PATTERN_BEGIN= MULTILINE_PATTERN_BODY= [...] MULTILINE_PATTERN_BODY= MULTILINE_PATTERN_END= применяется, когда образец может иметь переменное число строк. Начало сопоставления задается шаблоном MULTILINE_PATTERN_BEGIN, затем может идти что угодно, лишь бы оно подпадало хотя бы под один из шаблонов вида MULTILINE_PATTERN_BODY=, окончание сопоставления задается шаблоном MULTILINE_PATTERN_END. Пример 1: # python2/import-error.logoved MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\): MULTILINE_PATTERN_BODY=^\s\s MULTILINE_PATTERN_END=^ImportError: No module named (\S+) FIX=buildrequires --add python2.7(%{MULTILINE_END_GROUP:1}) __END__ Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/nose/suite.py", line 207, in run self.setUp() File "/usr/lib/python2.7/site-packages/nose/suite.py", line 290, in setUp self.setupContext(ancestor) File "/usr/lib/python2.7/site-packages/nose/suite.py", line 313, in setupContext try_run(context, names) File "/usr/lib/python2.7/site-packages/nose/util.py", line 471, in try_run return func() File "/usr/src/RPM/BUILD/python-module-fs-2.0.17/tests/test_ftpfs.py", line 90, in setUpClass from pyftpdlib.test import ThreadedTestFTPd File "/usr/lib/python2.7/site-packages/pyftpdlib/test/__init__.py", line 40, in <module> import sendfile ImportError: No module named sendfile Пример 2: # python3/import-error-module.logoved MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\): MULTILINE_PATTERN_BODY=^\s\s MULTILINE_PATTERN_END=^ModuleNotFoundError: No module named '(\S+)' FIX=buildrequires --add python3(%{MULTILINE_END_GROUP:1}) __END__ cd /usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source/tables/array && /usr/bin/ibus-table-createdb -n array30-big.db -s /usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source/tables/array/array30-big.tab Traceback (most recent call last): File "/usr/share/ibus-table/engine/tabcreatedb.py", line 29, in <module> import tabsqlitedb File "/usr/share/ibus-table/engine/tabsqlitedb.py", line 32, in <module> import sqlite3 ModuleNotFoundError: No module named 'sqlite3' make[2]: *** [tables/array/CMakeFiles/convert_array.dir/build.make:69: tables/array/array30-big.db] Error 1 make[2]: Leaving directory '/usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source' make[1]: *** [CMakeFiles/Makefile2:897: tables/array/CMakeFiles/convert_array.dir/all] Error 2 make: *** [Makefile:154: all] Error 2 error: Bad exit status from /usr/src/tmp/rpm-tmp.11890 (%build) 3.2.2 Параметры FIX и STATISTICS. Раз у нас есть регулярное выражение, то мы можем выделить в образце нужный нам фрагмент текста как ГРУППУ, просто взяв его в регулярном выражении в простые круглые скобки. Вернемся к правилу apt/E-package-not-found.logoved там есть PATTERN=^E: Couldn't find package (\S+) PATTERN=^E: Невозможно найти пакет (\S+) в которых выделена одна группа (группа №1, к ней можно обращаться как %{GROUP:1}). к примеру, для образца E: Couldn't find package libtau-common значением группы №1 станет libtau-common. Что мы можем сделать со значением группы? можем сосчитать частоту (статистка по умолчанию) добавим в правило параметр STATISTICS=%{GROUP:1} и для красоты заголовок - строку перед статистикой STATISTICS_HEADER=E: Невозможно найти пакет: получим в LOGS/apt-E-package-not-found файл статистики, и сразу станет ясно, что чинить в первую очередь. $ cat apt-E-package-not-found/00statistics E: Невозможно найти пакет: 5: gnustep-Etoile-DocGenerator 5: gdk-pixbuf-devel 4: python-module-setuptools-tests [...] 1: kdepim-devel Пример2: db/conf/pkgconfig.logoved содержит набор PATTERN=^Package (\S+) was not found in the pkg-config search path PATTERN=^configure: error: Package requirements \((\S+)\) were not met: PATTERN=^No package '(\S+)' found ругани на отсутствующий .pc файл. В каждом из шаблонов выделена группа №1. Простую статистику по частоте для нее считать не имеет смысла. Имело бы смысл разделить .pc файлы на отсутствующие в Сизифе и присутствующие в Сизифе, затем уже отдельно в каждой группе статистику по частоте. Но это пока не реализовано. Зато легко указать правило, как улучшить (а то и починить) пакет. Имя .pc файла -- готовый компонент для добавления в BuildRequires пакета. Соответствующая опция FIX имеет вид FIX=buildrequires --add pkgconfig(%{GROUP:1}) В случае набора PATTERN_SEQ все группы в наборе получают сплошную нумерацию. Набор PATTERN_SEQ=bla (\S+) was (\S+) PATTERN_SEQ=error: PATTERN_SEQ=foo '(\S+)' содержит группы %{GROUP:1} %{GROUP:2} %{GROUP:3} В случае MULTILINE_PATTERN_*, %{GROUP:xx} нет, а есть отдельно %{MULTILINE_BEGIN_GROUP:хх} %{MULTILINE_END_GROUP:хх} в python3/import-error-module.logoved, к примеру, будет для MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\): MULTILINE_PATTERN_BODY=^\s\s MULTILINE_PATTERN_END=^ModuleNotFoundError: No module named '(\S+)' FIX=buildrequires --add python3(%{MULTILINE_END_GROUP:1}) 3.2.3 Параметр DESCRIPTION. DESCRIPTION=В каких-то случаях сообщения об ошибках DESCRIPTION=могут быть недостаточно информативными. DESCRIPTION=В таких случаях хорошо бы составить описание DESCRIPTION=ошибки для пользователя. DESCRIPTION= DESCRIPTION=Для этого просто добавим DESCRIPTION= DESCRIPTION=перед каждой строкой. DESCRIPTION= DESCRIPTION=Исходное сообщение будет сохранено в файл DESCRIPTION=00description в каталоге отчета. 3.2.4 Ключевое слово __END__ После ключевого слова __END__ обработка файла .logoved прекращается, и все остальное его содержимое игнорируется. Поэтому после __END__ удобно хранить образцы сообщений, для поиска которых создавался логовед, чтобы можно было проверить, не сломали ли мы часом регулярное выражение. 4. За пределами правил Логовед. В некоторых случаях возможностей правил Логовед может не хватить. В таком случае можно спуститься на уровень ниже, в библиотеку Logoved-Stream. Там можно зарегистрировать обработчик (Listener) для указанного SCOPE= с нужным кодом, что занимается программным анализом поступающего потока. в интерфейсе 4 метода: write (<линия лог файла>) commit () - вызывается после окончания данных success() - когда секция завершилась успешно. error() - когда секция завершилась неуспешно. Успешной работы! -- I V ^ permalink raw reply [flat|nested] 6+ messages in thread
* [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа @ 2018-09-21 17:34 ` Igor Vlasenko 0 siblings, 0 replies; 6+ messages in thread From: Igor Vlasenko @ 2018-09-21 17:34 UTC (permalink / raw) To: devel Установка и работа. 1. Установка. git clone git://git.altlinux.org/people/viy/packages/logoved.git logoved.git для работы нужно установить noarch пакет perl-Logoved-Stream из Сизифа. 2. Работа с утилитой на примере beehive. Переходим в склонированный logoved.git. Копируем себе beehive-logs rsync -avp --delete-after git.altlinux.org::beehive-logs/Sisyphus-x86_64/latest/error . 2.1 Запускаем утилиту. time ./logoved-report -v error/* так как в beehive более 500 логов, запускаем с опцией -v, чтобы не скучать, следя за сообщениями [...] parsing error/zoneminder-1.30.4-alt3.S1 ... parsing error/zrtpcpp-2.3.4-alt2.1 ... ./logoved-report -v error/* 206,93s user 3,37s system 99% cpu 3:32,32 total три минуты, и все 500+ логов разобраны. Замечание. Таким образом мы обрабатываем все логи, которые есть в beehive. Если же есть желание разобрать только свои логи, (пакетов, где leader <ваш логин>) то поможет perl-ALTLinux-ACL >= 0.20 . команда в таком случае будет иметь вид time ./logoved-report `ls error/* | altlinux-acl-filter-list-by-access --nvr --leader --user <ваш логин>` сокращенно time ./logoved-report `ls error/* | altlinux-acl-filter-list-by-access --nvr -l -u <ваш логин>` 2.2 Результат запуска. Итак, после запуска ./logoved-report в текущем каталоге появилась папка LOGS а в ней файл 00FIXSCRIPT и большое количество папок apt-E-broken apt-E-ghost apt-E-package-not-found apt-E-version-not-found brp-alt-028-check_contents brp-alt-032-compres-man-page-broken-reference brp-alt-verify-elf-error build-compile-error build-Werror check-failed conf-automake-version conf-c++ conf-c-compiler conf-cmake-configure-failed conf-configure-error conf-configure-error-C-compiler-cant-create conf-configure-error-fortran-dont-compile conf-gir-vala conf-pkgconfig [...] и т.д. Пройдемся по подпапкам. В каждой папке собраны символические ссылки (опция по умолчанию) на лог файлы с ошибкой одного типа, а также служебные файлы, такие, как 00statistics. К примеру: $ ls apt-E-broken 00statistics gnustep-FortyTwo-0.2.0-alt4 gnustep-BDB-0.2.1-alt4 libctl-3.2.2-alt1_3 skytools-2.1.13-alt1 $ cat apt-E-broken/00statistics E: Broken packages: 2: Package perl-devel has broken dep on libdb4-devel 1: Package guile22-devel has broken dep on guile18-devel 1: Package postgresql9.6-server has broken dep on postgresql9.6 ls apt-E-package-not-found|wc -l 36 $ cat apt-E-package-not-found/00statistics E: Невозможно найти пакет: 5: gnustep-Etoile-DocGenerator 5: gdk-pixbuf-devel 4: python-module-setuptools-tests [...] 1: kdepim-devel и т. д. Разбивка по подпапкам выполняется по правилам, хранящимся в базе Логовед. База хранится рядом с logoved-report, в подпапке db: $ ls -1 db/ apt brp-alt build check [...] $ ls -1 db/apt 00default E-broken.logoved E-conflict.logoved E-ghost.logoved E-package-not-found.logoved E-version-not-found.logoved В базе Логовед хранятся правила Логовед (в файлах с расширением .logoved) и значения по умолчанию в файлах 00default. Каждый файл .logoved содержит правило, по которому можно выделить внутри лог файла некоторое сообщение об ошибке. Чтобы узнать, какие правила logoved сработали на лог файл и на что именно, можно воспользоваться утилитой logoved-grep (в том же git): $ ./logoved-grep LOGS/apt-E-package-not-found/xmds2-2.2.3-alt1 LOGS0/apt-E-package-not-found/xmds2-2.2.3-alt1 matches apt::E-package-not-found[error] in line 405: E: Couldn't find package python-module-cheetah Легко догадаться, что подпапка LOGS/apt-E-broken порождена правилом db/apt/E-broken.logoved, подпапка LOGS/apt-E-package-not-found порождена правилом db/apt/E-package-not-found.logoved, и т. д. Пример правила Логовед. $ cat db/apt/E-package-not-found.logoved # E: Couldn't find package libtau-common PATTERN=^E: Couldn't find package (\S+) PATTERN=^E: Невозможно найти пакет (\S+) STATISTICS=%{GROUP:1} STATISTICS_HEADER=E: Невозможно найти пакет: Кроме подпапок, порожденных правилами, в LOGS/ находятся "служебные" подпапки отчета Логовед, LOGOVED-not-matched LOGOVED-overcome LOGOVED-fixable В папке LOGOVED-not-matched собраны ссылки на "нераспознанные" лог файлы, для которых ни одно правило логовед не сработало. Если увидите в этой папке повторяющиеся ошибки, стоит создать для них новое правило логовед. Если сообщение об ошибке фатальное, то после сообщения об ошибке соответствующий этап сборки должен в итоге аварийно завершиться. Однако это бывает не всегда. В папке LOGOVED-overcome собраны и разложены по соответствующим подпапкам ошибки, которые вроде бы были преодолены на соответствующем этапе сборки, т.е. они встретилсь в секции, к примеру, %build, тем не менее сборка пошла дальше, "преодолела" (overcome) эту ошибку и в итоге упала, к примеру, на %files, как в примере $ ./logoved-grep error/ftimes-3.10.0-alt2 error/ftimes-3.10.0-alt2 matches run::command-not-found::other[success] in line 254: /bin/sh: line 1: pod2html: command not found error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 698: collect2: error: ld returned 1 exit status error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 755: collect2: error: ld returned 1 exit status error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 817: collect2: error: ld returned 1 exit status error/ftimes-3.10.0-alt2 matches perl::cant-locate-in-inc[success] in line 906: Can't locate Digest/SHA1.pm in @INC (you may need to install the Digest::SHA1 module) (@INC contains: /usr/local/lib64/perl/5.26 /usr/local/share/perl/5.26 /usr/lib64/perl5 /usr/share/perl5 /usr/lib64/perl5 /usr/share/perl5 /etc/perl5 /usr/lib/perl5/vendor_perl .) at ../../../../../utils/tree_builder line 158. error/ftimes-3.10.0-alt2 matches rpmbuild-error::file-not-found-by-glob[error] in line 952: File not found by glob: /usr/src/tmp/ftimes-buildroot/usr/bin/* Причины для такого поведения могут быть разные. От кривого Makefile, который не выпустил ошибку наружу, до безвредных сотрясений воздуха. В любом случае, разбираться надо более тщательно, поэтому они выделены внутрь отдельной подпапки LOGOVED-overcome. Подпапка LOGOVED-fixable сейчас дополнительно содержит ссылки на логи, для которых сгенерировано автоисправление. При этом эти же каталоги и ссылки содержатся и обычным порядком в LOGS/. Это, возможно, временное поведение. В зависимости от опций командной строки LOGOVED-fixable либо не будет создаваться вообще (все чиним руками) либо, логи, там упомянутые, будут удаляться из других папок в LOGS/, чтобы разделить логи, которые скормим роботу от логов, которые будем чинить руками. Сгенерированное автоисправление представляет собой файл LOGS/00FIXSCRIPT. wc -l 00FIXSCRIPT 42 Т.е. из 500+ пакетов beehive робот попытался бы починить сборку 42. 00FIXSCRIPT представляет собой таблицу <имя srpm,обязательно><tab><имя srpm,опционально><tab>команда на починку Пример: head 00FIXSCRIPT acct acct-6.6.1-alt1 buildrequires --add makeinfo bacula7 bacula7-7.4.7-alt3.S1 buildrequires --add /proc bacula bacula-5.2.13-alt11 buildrequires --add /proc bacula bacula-5.2.13-alt11 sourcedep --add-devel-lib gssapi_krb5 cairo-dock-plugins cairo-dock-plugins-3.4.1-alt10.S1 buildrequires --add pkgconfig(libdrm) cairo-dock-plugins cairo-dock-plugins-3.4.1-alt10.S1 buildrequires --add python2.7(multiprocessing) chromium chromium-69.0.3497.81-alt1 buildrequires --add python2.7(multiprocessing) clisp clisp-2.48-alt1.qa1 buildrequires --add groff-ps compiz compiz-0.9.13.1-alt1 buildrequires --add pkgconfig(libdrm) emacs-chess emacs-chess-2.0-alt5.b6.qa1 sourcedep --add-path makeinfo emacs-elib emacs-elib-1.0-alt8 sourcedep --add-path makeinfo [...] 00FIXSCRIPT -- это скрипт для утилиты logoved-batchfix, которая пока в разработке. Я не включал ее в этот релиз, так как утилита пока не поддерживает работу с gear репозиториями, но с src.srpm она уже успешно работает, и я ей активно пользуюсь в autoimports/fcimport, autoimports/mgaimport и т. д. Пример запуска: $ cd ../logoved.git $ time ./logoved-report fcimport-aupd/TASK.BAD ./logoved-report fcimport-aupd/TASK.BAD 27,41s user 1,19s system 93% cpu 30,593 total $ cd ../logoved-batchfix.git $ ./logoved-batchfix --batch ../logoved.git/LOGS/00FIXSCRIPT --srpmdir ../fcimport.git/OUT Записан: OUT.FIXED/FlightGear-Atlas-0.5.0-alt1_0.47.cvs20141002.src.rpm Записан: OUT.FIXED/avr-gdb-8.1-alt1_2.src.rpm Записан: OUT.FIXED/boxes-1.1.1-alt1_13.src.rpm [...] Записан: OUT.FIXED/rwall-0.17-alt1_53.src.rpm Записан: OUT.FIXED/sshuttle-0.78.4-alt1_5.src.rpm Записан: OUT.FIXED/steadyflow-0.2.0-alt1_4.src.rpm (36 пакетов) Замечание. По умолчанию в ./logoved-report включен --flat mode. Есть еще nested mode, который включается опцией --nested. flat mode хорош для десктопа и больших экранов. В nested mode ./logoved-report переводит путь в базе Логовед к файлу правил в подкаталоги. ls LOGS/ 00FIXSCRIPT error fixable not-matched overcome LOGS/ error/ apt/ E-package-not-found/ E-ghost/ E-version-not-found/ E-broken/ ... Во flat mode цепочки подкаталогов 2-го уровня распрямляются в один каталог, (заменяем в пути '/' на '-') каталог 1-го уровня error/ убирается, а его содержимое переносится на 1-й уровень, остальные каталоги 1-го уровня получают приставку 'LOGOVED-'. -- I V ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед. 2018-09-21 17:49 ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko 2018-09-21 17:34 ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko @ 2018-09-21 18:38 ` Igor Vlasenko 1 sibling, 0 replies; 6+ messages in thread From: Igor Vlasenko @ 2018-09-21 18:38 UTC (permalink / raw) To: devel Вдогонку: 3.2.4 Параметр TYPE. В текущей реализации logoved-report между правилами Логовед возможен конфликт за строку, когда на одной строке срабатывает несколько правил. Надо каким-то образом указать, какое из них самое релевантное. Или же в сообщении об ошибке можно выделить конкретные разновидности и общую часть, и сделать набор правил, который пытается выделить конкретные разновидности, но если конкретной разновидности нет в базе, пусть сработает хотя бы общая часть. Для этого используется параметр TYPE. TYPE=error -- самое релевантное. TYPE=fallback -- менее релевантное. TYPE=fallback2 -- еще менее релевантное. TYPE=fallback3 -- ну, вы поняли логику. Пример, где это используется. db/findreq/shebang.req/emacs-var.logoved PATTERN=Unrecognized switch: -\*- FIX=hook set_kill_shabang-env-perl.pl db/findreq/shebang.req/env.logoved PATTERN=too many arguments:.*/bin/env FIX=hook set_kill_shabang-env-perl.pl db/findreq/shebang.req/trailing-cr.logoved PATTERN=trailing <CR> in interpreter FIX=hook set_kill_cr_shabang.pl 3 конкретных случая, для каждого из которых у робота есть лечение. Общий случай, не знаем что делать, ловим для ручной обработки. db/findreq/shebang.req/other.logoved TYPE=fallback PATTERN=shebang.req: ERROR TYPE=fallback означает, что это правило Логовед будет считаться сработавшим только тогда, когда ни одно другое правило с TYPE=error не сработало. И еще более общий случай, db/findreq/other.logoved TYPE=fallback2 PATTERN=^find-requires: ERROR: /usr/lib/rpm/.*\.req failed сработает уже только, если ни TYPE=error, ни TYPE=fallback не сработал и не распознал конкретную причину. -- I V ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] I: утилита logoved-report для обработки логов. 1-введение. 2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko 2018-09-21 17:52 ` Igor Vlasenko @ 2019-06-25 8:36 ` Michael Shigorin 1 sibling, 0 replies; 6+ messages in thread From: Michael Shigorin @ 2019-06-25 8:36 UTC (permalink / raw) To: devel On Fri, Sep 21, 2018 at 08:33:13PM +0300, Igor Vlasenko wrote: On Fri, Sep 21, 2018 at 08:34:21PM +0300, Igor Vlasenko wrote: On Fri, Sep 21, 2018 at 08:49:25PM +0300, Igor Vlasenko wrote: > Предлагаю вашему вниманию утилиту logoved-report > для обработки логов неудавшихся сборок. А этот трёхтомник попал сюда: http://altlinux.org/logoved-report On Fri, Sep 21, 2018 at 08:52:09PM +0300, Igor Vlasenko wrote: ...с учётом поправок. -- ---- WBR, Michael Shigorin / http://altlinux.org ------ http://opennet.ru / http://anna-news.info ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-06-25 8:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko 2018-09-21 17:52 ` Igor Vlasenko 2018-09-21 17:49 ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko 2018-09-21 17:34 ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko 2018-09-21 18:38 ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko 2019-06-25 8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git