Разработчики и тестеры постоянно используют файлы журнала и метрики для поиска и устранения неполадок. Но, к сожалению, получение полезных часто включает в себя данные Wrungling, Regexes и Parsing Scripts.
Вот пример, используя типичную линию журнала от/var/log/system.log на моем Mac:
May 9 05:35:12 Gavins-MacBook-Pro com.apple.xpc.launchd[1] (com.apple.sandboxd[7344]): Service exited due to SIGALRM | sent by kernel_task[0]
Теперь, давайте скажем, вы хотите построить отчет, который показывает, какие услуги вышли, и по каким причинам. Например, что-то вроде это:
REASON SERVICE SIGALRM com.apple.sandboxd SIGKILL QA2G25RMZ4.com.wunderkinder.wunderlist-helper SIGKILL com.apple.AirPlayUIAgent SIGKILL com.apple.LocalAuthentication.UIAgent SIGKILL com.apple.OSDUIHelper . . . . . . . . . . . .
Сначала вам нужно понять структуру строк журнала, как приведенная выше, чтобы вы могли получить данные, необходимые для отчета. С небольшим осмотром (и некоторые догадки) вы можете придумать (подчеркнутые крышки представляют параметры):
День месяца HH: MM: SS Host Process1 PID1. : Сервис вышел из-за SignalType | Отправлено процессором2 [PID3]
Вы также должны быть в состоянии однозначно идентифицировать все вхождения этого «типа события», чтобы эффективно изучать данные. Это может быть сделано путем поиска некоторых идентификационных текстов, например «обслуживание вышел». Я попробовал это с Grep, и оказалось слишком общее, так как он также соответствует другим подобным событиям, как этот:
May 8 13:39:49 Gavins-MacBook-Pro com.apple.xpc.launchd[1] (com.apple.WebKit.Networking.A4992C6F-8F69-4EA9-A031-76B032FB964F[7720]): Service exited with abnormal code: 1
Изменение срока поиска «Сервис вышел из-за», казалось, решал проблему, но я проверил это только в небольшом файле журнала, поэтому возможно, что есть другие типы событий, которые также сопоставляют этот термин. Важным моментом здесь является то, что вам нужен способ уникально идентифицировать тип события, или ваш анализ будет генерировать неправильные данные.
Далее вам нужно написать программу или сценарий, найдут соответствующие строки журнала, разрывов причина и обслуживание и выводит результаты. Чтобы сделать отчет более читабельным, вам также необходимо отфильтровать дублирующиеся строки (мой GREP показал много) и сортировать по выходе из причина и подпункта по службе. Вот способ сделать это:
• Найти все соответствующие события • извлечь причину и обслуживание, используя Regexes и распределение правильных данных • Сортировка результатов по причине • Для каждой причины подсортируют по службе • распечатайте линию по причине и обслуживанию и подавить любые следующие строки, которые имеют одинаковую причину и обслуживание
Хотя вышеизложенное не вовлекает ракету науки, она требует выяснения правильных регенсов и разбирающихся выражений вместе с достойными кодирующими/навыками сценариев. Но это не все.
Если событие из вашего собственного приложения, вы также будете поддерживать его через версии программного обеспечения. Это довольно распространено для добавления текста или параметров к существующим типам событий, или для добавления новых аналогичных событий, которые могут быть добавлены, оба из которых могут нарушить ваш разбор. Более большая проблема заключается в том, что вы никогда не можете даже не узнать, что ваш сценарий перестает найти предполагаемые матчи.
А потом inlcher. Вышеуказанное обсуждение составляет только один тип события. Большинство приложений имеют тысячи разных типов событий — каждая со своей собственной структурой. Хотя вам не понадобится мой тип события, время, когда вам нужно часто наименее удобными (например, ваша ошибка может удерживать критическую сборку, или вы можете затащить в эскалацию клиентов).
Мы придумали новый подход
Zebrium использует неассистную машину, обученную: • Определить все уникальные типы событий (обычно тысячи на заявку) • Создайте схему для типа события (структурирование фиксированных текстовых и переменных параметров) • Поместите каждый тип события в представление, где каждый параметр имеет свой напечатанный столбец
Все это создано для простого запроса и самообеспечена в виде структуры файлов журнала.
Результат
Я перетащил файл журнала, упомянутый выше (/var/log/system.log) в ui Zebrium. Используя только этот файл, и без предварительного обучения или данных WRNNLING, наше машинное обучение выполнило свою магию:
• Он определил 500+ уникальных типов событий и создал представление для каждого • Он создал индекс и классифицировал каждый тип события по теме, что сделало очень легко найти то, что я искал (это было названо v_service_exted_due_sent_by «) • А затем одна строка SQL производила отчет (это действительно одна строка, но я разбил его на 3, чтобы сделать его более читаемым ниже ). Обратите внимание, что вы также можете получить на эти данные через наш UI, не написав любым SQL.
SELECT DISTINCT _to AS Reason, _str AS Service FROM v_service_exited_due_sent_by ORDER BY Reason, Service; Reason | Service ---------+------------------------------------------------------------------ SIGALRM | com.apple.sandboxd SIGKILL | QA2G25RMZ4.com.wunderkinder.wunderlist-helper SIGKILL | com.apple.AirPlayUIAgent SIGKILL | com.apple.LocalAuthentication.UIAgent SIGKILL | com.apple.OSDUIHelper SIGKILL | com.apple.SystemUIServer.agent SIGKILL | com.apple.UserEventAgent-Aqua SIGKILL | com.apple.ViewBridgeAuxiliary
Это не вообще не было времени. Мне не пришлось думать о Regexes, разборке, написании кода и т. Д. Мне не пришлось ничего заранее подготовиться или знать заранее, что я хотел запросить. Без предварительного обучения и крошечного набора данных (58К строк) наш ML структурировал весь файл журнала. И с одной линейкой SQL я произвел отчет, который я хотел!
Я собирался закончить блог здесь, но решил сделать еще одну вещь! Я хотел посмотреть. Ну, вы уже догадались, это также можно сделать с помощью одной строки SQL. Все, что мне нужно было сделать, это присоединиться к взглядам на два типа событий. Вот результат:
SELECT DISTINCT _to AS Reason, a._str AS Service, _code FROM v_service_exited_due_sent_by A JOIN (SELECT DISTINCT _str, _code FROM v_service_exited_abnormal_code ) B ON A._str = B._str; Reason | Service | _code ---------+-------------------------------+---------- SIGKILL | com.apple.ViewBridgeAuxiliary | 2
Если вы разработчик или тестер, который касается получения информации в файлах журнала, пожалуйста, предварительно зарегистрируйтесь на нашу бета-программу здесь Отказ
Оригинал: «https://dev.to/gdcohen/perfectly-structuring-logs-without-parsing-2f92»