Как запись в черном ящике, файлы журналов содержат драгоценную криминалистическую информацию, когда вам нужно диагностировать проблемы. Давайте изучим искусство читать их
Эндрю Уэлч/ Nystudio107
В программировании используется старая практика ведения ведения ведения ведения, чтобы предоставить запись не только ошибок, но и общей информации о статусе. Именно этот контекст делает их полезными, когда вы пытаетесь выяснить, что произошло.
Файлы журналов-это ваша запись «черного ящика» того, что произошло, что позволяет вам собрать вещи вместе после Факто, когда что-то пойдет не так.
Ремесл CMS отладка
Craft cms ничем не отличается тем, что он создает ряд журналов, чтобы помочь вам. Если вы отлаживаете в локальном разработке, я рекомендую использовать панель инструментов отладки, как обсуждалось в Профилирование вашего сайта с помощью панели инструментов отладки CRAFT CMS 3 статья:
Панель инструментов отладки обеспечивает доступ к журналам Craft CMS в хорошем графическом интерфейсе, который позволяет легко искать, сортировать и фильтровать различными способами. Для получения дополнительной информации об использовании панели инструментов отладки, пожалуйста, см. Профилирование вашего веб -сайта с помощью статьи на панели панели отладки CMS CMS 3.
Во многих случаях вам нужно отладить проблему, которую у вас есть только файлы журнала, потому что:
- Вы не можете воспроизвести проблему на месте
- У вас нет никаких шагов, чтобы воспроизвести проблему
- Проблема произошла на чужом веб -сайте
В этих случаях мы будем полагаться на файлы журнала, чтобы узнать, что произошло, так что давайте посмотрим, как выглядят различные файлы журнала в Craft CMS.
Craft CMS -файлы журнала
Craft CMS создает несколько файлов журнала в хранение/журналы/ каталог. Формат информации, зарегистрированной в каждом, одинаково, но файлы разделены, чтобы облегчить их прочитать их.
Вот файлы журнала, которые создает CMS CMS в хранилище/журналы/ каталог:
- web.log — Это основной файл веб -журнала, где в конечном итоге будет в конечном итоге большинство журналов из Craft CMS & Plugins
- web404s.log — Вот где детали любых 404 не найден HTTP -запросы регистрируются; Они зарегистрированы отдельно, чтобы не задумываться о web.log
- Консоль.log — Эта консоль или версия CLI web.log ; Когда вы запускаете ремесло через CLI, именно здесь большинство журналов
- queue.log — Здесь заканчивается любая регистрация с заданий по очереди (например, «повторные элементы»).
- phperrors.log — Вот где жесткие ошибки PHP, которые не могли быть обработаны Обработка исключений YII2 хранятся
Даже если вы используете стороннюю службу журнала, такую как ПЭСПЕРЛА или Часовой Чтобы перенаправить или агрегировать свои журналы Craft CMS, информация в этой статье все равно поможет вам переварить журналы ремесленных ремесленных судов.
Типичный хранение/журналы/ каталог может выглядеть так:
vagrant@homestead ~/sites/craft3/storage/logs $ ls -al total 63632 drwxr-xr-x 12 vagrant vagrant 384 Jul 20 2019 . drwxr-xr-x 10 vagrant vagrant 320 Feb 16 03:11 .. -rw-r--r-- 1 vagrant vagrant 180660 Jul 17 03:03 console.log -rw-r--r-- 1 vagrant vagrant 389886 Jul 17 02:05 queue.log -rw-r--r-- 1 vagrant vagrant 132927 Jul 20 2019 web-404s.log -rw-r--r-- 1 vagrant vagrant 8072957 Jul 20 2019 web.log -rw-r--r-- 1 vagrant vagrant 10497035 Jul 18 20:37 web.log.1 -rw-r--r-- 1 vagrant vagrant 10578305 Jul 18 20:37 web.log.2 -rw-r--r-- 1 vagrant vagrant 10555544 Jul 18 20:37 web.log.3 -rw-r--r-- 1 vagrant vagrant 10555546 Jul 18 20:37 web.log.4 -rw-r--r-- 1 vagrant vagrant 10578305 Jul 18 20:37 web.log.5
Обратите внимание, что все журналы вращаются, как только они достигают максимального размера файла 10 240 KB, до максимум 5 повернутых журналов (оба максимума по умолчанию могут быть изменены через app.php config). Итак, в приведенном выше примере web.log.5 Файл является самым старым файлом журнала, и web.log текущий файл журнала.
Расширение строки файла журнала CRAFT CMS
Давайте рассечь линию от моего web.log файл:
2019-03-04 00:08:49 [-][1][mivsgmhfgalsu5k7cv1f0q8m13][trace][yii\base\Module::getModule] Loading module: site-module
- 2019-03-04 00:08:49 -Дата и время зарегистрированного сообщения (отформатировано как Y-M-D H: I: S во время сервера)
- [-] — IP -адрес клиента по умолчанию отредактирован в - для Соответствие GDPR
- [1] — Идентификатор пользователя в настоящее время в настоящее время в пользователе (или - Если пользователь не вошел в систему)
- [mivsgmhfgalsu5k7cv1f0q8m13] — идентификатор сеанса (или - Если сеанс не существует)
- [трассировка] — Уровень сообщения журнала (N.B. трассировка это aka отладка , Смотри ниже)
- [yii \ base \ module:: getModule] — Категория сообщения журнала, обычно установленная на Class:: Метод Это называлось журналом, через Метод
- Модуль загрузки: сайт-модуль — Само сообщение журнала
Давайте посмотрим на журнал Уровни, с которыми вы столкнетесь:
- отладка (AKA TRACE )- Сообщение, чтобы отследить, как работает кусок кода. Это в основном для использования в разработке.
- Информация — Сообщение, которое передает некоторую полезную информацию.
- Предупреждение — Предупреждающее сообщение, которое указывает на что -то неожиданное, произошло.
- Ошибка — фатальная ошибка, которая должна быть исследована как можно скорее.
- профиль — особый тип журнала сообщений, который используется для измерения времени взят определенные кодовые блоки
Важно отметить, что если DevMode Включен, ремесло будет только уровни регистрации Предупреждение , Ошибка & профиль . Мы не освещаем уровень профиля здесь, чтобы получить дополнительную информацию об этом, ознакомьтесь с Профилирование вашего сайта с помощью панели инструментов отладки CRAFT CMS 3 статья.
Поскольку Craft CMS основана на структуре YII2, вы можете прочитать на кровавые детали Yii2 журналирование здесь Анкет
Теперь, когда у нас есть заземление на то, что находится в ремесленных бревнах CMS, давайте погрузимся в то, как читать чайные листья.
Дивенирование Значение из файлов журналов Craft CMS
Настолько здорово, что мы вооружены знаниями о том, как различные файлы журнала находятся в Craft CMS, а также как выглядит каждая строка журнала. Но есть тонна информации, зарегистрированной по ремеслу, особенно если DevMode на.
Если DevMode включено, в дополнение к Ошибка , Предупреждение & профиль Уровни журнала, мы также регистрируем трассировка (aka отладка ) и Информация Log Уровни тоже.
Хотя теоретически это может показаться, что это не так уж важно, добавляя еще 2 уровня журнала, на практике это фактически добавляет кучу информации в файлы журналов. Частично причина в том, что каждый запрос базы данных теперь регистрируется:
2019-03-04 00:08:49 [-][-][mivsgmhfgalsu5k7cv1f0q8m13][profile begin][yii\db\Command::query] SELECT d.nspname AS table_schema, c.relname AS table_name, a.attname AS column_name, COALESCE(td.typname, tb.typname, t.typname) AS data_type, COALESCE(td.typtype, tb.typtype, t.typtype) AS type_type, a.attlen AS character_maximum_length, pg_catalog.col_description(c.oid, a.attnum) AS column_comment, a.atttypmod AS modifier, a.attnotnull = false AS is_nullable, CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default, coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc, CASE WHEN COALESCE(td.typtype, tb.typtype, t.typtype) = 'e'::char THEN array_to_string((SELECT array_agg(enumlabel) FROM pg_enum WHERE enumtypid = COALESCE(td.oid, tb.oid, a.atttypid))::varchar[], ',') ELSE NULL END AS enum_values, CASE atttypid WHEN 21 /*int2*/ THEN 16 WHEN 23 /*int4*/ THEN 32 WHEN 20 /*int8*/ THEN 64 WHEN 1700 /*numeric*/ THEN CASE WHEN atttypmod = -1 THEN null ELSE ((atttypmod - 4) >> 16) & 65535 END WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/ WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/ ELSE null END AS numeric_precision, CASE WHEN atttypid IN (21, 23, 20) THEN 0 WHEN atttypid IN (1700) THEN CASE WHEN atttypmod = -1 THEN null ELSE (atttypmod - 4) & 65535 END ELSE null END AS numeric_scale, CAST( information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t), information_schema._pg_truetypmod(a, t)) AS numeric ) AS size, a.attnum = any (ct.conkey) as is_pkey, COALESCE(NULLIF(a.attndims, 0), NULLIF(t.typndims, 0), (t.typcategory='A')::int) AS dimension FROM pg_class c LEFT JOIN pg_attribute a ON a.attrelid = c.oid LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum LEFT JOIN pg_type t ON a.atttypid = t.oid LEFT JOIN pg_type tb ON (a.attndims > 0 OR t.typcategory='A') AND t.typelem > 0 AND t.typelem = tb.oid OR t.typbasetype > 0 AND t.typbasetype = tb.oid LEFT JOIN pg_type td ON t.typndims > 0 AND t.typbasetype > 0 AND tb.typelem = td.oid LEFT JOIN pg_namespace d ON d.oid = c.relnamespace LEFT JOIN pg_constraint ct ON ct.conrelid = c.oid AND ct.contype = 'p' WHERE a.attnum > 0 AND t.typname != '' AND c.relname = 'retour_redirects' AND d.nspname = 'public' ORDER BY a.attnum;
И их много, поэтому куча, которую вы должны искать, становится большим. Эта стратегия «регистрировать все» на самом деле очень полезна, когда вы делаете криминалистику, чтобы выяснить, что произошло. Чем больше контекста, тем лучше.
Но это также немного похоже на поиск иглы в стоге сена, чтобы найти то, что действительно важно для вас.
Итак, давайте посмотрим на несколько стратегий, которые могут помочь найти то, что мы ищем.
1. Удалить журналы
Если вы пытаетесь воспроизвести проблему (особенно в локальном разработке), один из способов облегчить просеивание куча информации — это меньше информации для просмотра!
- Перейдите на страницу Frontend или страницу CP, где вы можете воспроизвести проблему
- Удалить все файлы журнала либо через графический интерфейс, либо через rm -f Storage/logs/* через оболочку
- Воспроизведите проблему
Теперь ваши файлы журнала будут оформлены в основном до соответствующей информации, и это должно упростить вашу работу. Если вам нужно, тогда передать проблему с Pixel & Tonic или разработчиком плагинов, это также дает вам краткие и соответствующие журналы для них.
2. Поиск по [ошибке]
Если вы пытаетесь найти ошибку, о которой сообщается Craft или плагин, обычно она будет регистрироваться с уровнем журнала Ошибка Анкет
Но если вы просто ищете на Ошибка Вы найдете тонны матчей. Вместо этого используйте знания, которые мы узнали ранее для поиска на уровне журнала [ошибка] (с [] ) Это должно помочь вам найти только линии, где выбрасывается фактическая ошибка.
3. Ползти стека
Если фактическая ошибка выброшена, обычно будет то, что называется «трассировкой стека» сразу после строки ошибок в вашем файле журнала. В худшем случае, вы всегда можете просто найти файл журнала для стек трассировка Анкет Он стек трассировки от Фактическая проблема Я пытался отследить:
Stack trace: #0 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/helpers/Assets.php(93): craft\elements\Asset->getFolder() #1 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/services/Assets.php(579): craft\helpers\Assets::generateUrl(Object(craft\volumes\Local), Object(craft\elements\Asset)) #2 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/elements/Asset.php(773): craft\services\Assets->getAssetUrl(Object(craft\elements\Asset), NULL) #3 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Component.php(139): craft\elements\Asset->getUrl() #4 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/base/Element.php(879): yii\base\Component->__get('url') #5 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/elements/Asset.php(582): craft\base\Element->__get('url') #6 /home/vagrant/webdev/craft/craft-retour/src/Retour.php(306): craft\elements\Asset->__get('url') #7 [internal function]: nystudio107\retour\Retour->nystudio107\retour\{closure}(Object(craft\events\ElementEvent)) #8 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Event.php(312): call_user_func(Object(Closure), Object(craft\events\ElementEvent)) #9 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Component.php(636): yii\base\Event::trigger('craft\\services\\...', 'beforeSaveEleme...', Object(craft\events\ElementEvent)) #10 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/services/Elements.php(502): yii\base\Component->trigger('beforeSaveEleme...', Object(craft\events\ElementEvent)) #11 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/controllers/AssetsController.php(118): craft\services\Elements->saveElement(Object(craft\elements\Asset)) #12 [internal function]: craft\controllers\AssetsController->actionSaveAsset() #13 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array) #14 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array) #15 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/web/Controller.php(187): yii\base\Controller->runAction('save-asset', Array) #16 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Module.php(528): craft\web\Controller->runAction('save-asset', Array) #17 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/web/Application.php(298): yii\base\Module->runAction('assets/save-ass...', Array) #18 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/web/Application.php(565): craft\web\Application->runAction('assets/save-ass...', Array) #19 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/web/Application.php(277): craft\web\Application->_processActionRequest(Object(craft\web\Request)) #20 /home/vagrant/sites/craft3/vendor/yiisoft/yii2/base/Application.php(386): craft\web\Application->handleRequest(Object(craft\web\Request)) #21 /home/vagrant/sites/craft3/web/index.php(24): yii\base\Application->run() #22 {main}
Это может выглядеть немного страшно, но мы можем разбить его на что -то легко понятное.
Прежде всего, следы стека — это список функций или методов, которые называются в обратном порядке, пока не произойдет ошибка или исключение.
Bottommost Item в трассировке стека с надписью #22 {main} где началось исполнение, и оно заканчивается в #0 где была поймана ошибка:
#0 /home/vagrant/sites/craft3/vendor/craftcms/cms/src/helpers/Assets.php(93): craft\elements\Asset->getFolder()
Давайте разберемся, что говорит нам эта линия:
- #0 — Это 0 th строка в трассировке стека до того, как произошла ошибка; Подумайте «земля нулю»
- /home/vagrant/sites/craft3/vendor/cractcms/cms/src/helpers/assets.php — Путь к файлу в которой произошла ошибка
- (93) — номер строки в вышеупомянутом файле, где произошла ошибка
- Craft \ Elements \ Asset-> getFolder () — строка кода где произошла ошибка или исключение
Так здорово! Это дает нам довольно хорошее представление о том, что произошло, и мы можем оглянуться назад через трассу стека, чтобы увидеть все функции/методы, которые были названы ведущими к ошибке.
4. Посмотрите в нужном месте
Если вы пытаетесь диагностировать проблему, убедитесь, что вы смотрите на правильный файл журнала. Хотя это может показаться основным, это важно иметь в виду.
Например, если вы пытаетесь диагностировать проблему с работой в очереди, такой как «Resairs Elements», любые ошибки будут регистрироваться в queue.log , не нормальный web.log файл.
Точно так же, если вы пытаетесь отладить консольную команду, убедитесь, что вы смотрите в Консоль.log , не нормальный web.log файл.
5. Используйте console.app
Если вы используете Mac, вы можете рассмотреть возможность использования Console.App (в приложениях/утилитах) Когда вы делаете серьезный файл журнала Spelunking. Это стройная, подлая машина для еды.
Ваш текстовый редактор, вероятно, фантастичен для редактирования кода, но, как правило, он только проходит для анализа масс данных в файле журнала.
Действительно удобная функция заключается в том, что вы можете использовать фильтр Console.App в верхней части окна, чтобы показать только строки, которые содержат переоборудование В примере скриншота.
Затем вы можете использовать его функцию поиска для поиска только полученных строк фильтров файла журнала для конкретного текста, Ошибка в таком случае.
Console.App действительно предназначена для файлов журналов анализа; Если вы дважды нажмите на любой файл с помощью .log Суффикс, консоль.app открывается по умолчанию.
6. Используйте командную строку
Если вы чувствуете себя комфортно, используя CLI, вот несколько команд, которые вы можете подать полезным:
- grep -f '[error]' web.log — Поиск web.log Файл для фиксированной строки [ошибка] и отображение соответствующих линий. Больше информации…
- grep -c 2 -f '[error]' web.log — добавление -C 2 Опция к вышеуказанной команде заставляет его также распечатать 2 строки до и 2 строки после матча. Больше информации…
- Tail -f web.log | grep -f '[ошибка]' — Непрерывно контролировать web.log Файл и выводит любые новые строки, зарегистрированные на нем, которые соответствуют фиксированной строке [ошибка] Анкет Больше информации…
Делать вниз
Надеемся, что представленная здесь информация даст вам некоторое представление о том, как работает механизм ведения журнала, и что означает данные в файлах журнала.
Это даст вам гибкость и расширение прав и возможностей, чтобы сделать диагноз ошибок самостоятельно.
С помощью этой криминалистической информации у нас может быть довольно хорошая идея, что происходит, и попытаться исправить ее, или, по крайней мере, иметь действительно хороший отчет об ошибках для Pixel & Tonic или автора плагинов.
Даже если вы в конечном итоге не тот, кто исправит ошибку, тем лучше отчет об ошибке, что вы проходите вперед, тем более вероятно, что проблема будет решена с Alacrity.
Если вы хотите еще больше сгибать свои мышцы, ознакомьтесь с созданием пользовательского регистратора для Craft CMS.
Счастливого журнала!
Дальнейшее чтение
Если вы хотите получить уведомление о новых статьях, следуйте Nystudio107 в Твиттере.
Copyright © 2020 NYSTUDIO107. Разработано NYSTUDIO107
Оригинал: «https://dev.to/gaijinity/zen-and-the-art-of-craft-cms-log-file-reading-5b44»