Логирование скрипта
Объект logger пишет шаги робота в панель Studio, в файл и в SQLite. Ночной прогон с расписания без лога оставляет только «скрипт упал». Включайте logger в первом десятке строк, не «когда уже сломалось».
Сначала init
init задаёт минимум уровня (0..5), признак «скрипт не из чужой IDE», вывод в панель, путь текстового лога, путь SQLite, формат даты, локаль, транслит.
$logger->init(
1,
true,
true,
"C:\\bots\\logs\\run.txt",
"C:\\bots\\logs\\run.sqlite"
);
$logger->info("Старт обхода");
Пустая строка пути — этот канал выключен. Две копии Studio: разные файлы логов, иначе записи перемешаются. См. порты.
Формат даты по умолчанию в объекте: d-m-Y H:i:s. Локаль en / ru влияет на подписи уровней в панели.
Полная сигнатура init: минимум уровня (0..5), «скрипт не из чужой IDE», вывод в панель, путь txt, путь sqlite, формат даты, локаль, транслит, use XHE API. Пустая строка пути — канал выключен. На машине разработчика оставьте debug; на ночном RT поднимите минимум до info, чтобы не раздувать файл селекторами.
Уровни сообщений
- trace / debug — отладка селекторов, сырые ответы
- info($message, $data=null, $caller='', $isBold=false) — шаг («открыл URL», «строк 12»)
- warn — обошли проблему, сценарий продолжается
- error / critical — сбой шага
- Общий log($level, $message, $data)
Минимум в init отсекает шум: на боевом роботе info+, debug оставьте для машины разработчика.
| Код | Уровень | Когда |
|---|---|---|
| 0 | trace | Сырой обмен, только локально |
| 1 | debug | Селекторы, промежуточные строки |
| 2 | info | Шаг сценария (бой) |
| 3 | warn | Обошли и пошли дальше |
| 4–5 | error / critical | Шаг сломался |
HTML в панели: setFormatTagsForHtmlFormat. Жирное сообщение — флаг $isBold у info/log.
Что писать на шагах
Пишите после успешного wait, не до него — иначе журнал врёт, что страница готова. Связка: ожидание DOM.
- Старт: URL, порт (get_port), имя задачи расписания.
- После navigate: ошибка навигации, если есть.
- После выборки: число строк/писем, путь сохранённого файла.
- Перед exit: «готово» или «остановлен на шаге N».
$logger->info("navigate ok", array("url" => "https://example.com"));
$input->wait_element_exist_by_name("q");
$logger->info("поле q на месте");
Не кладите в лог пароли почты и ключи капчи. Транслит кириллицы для чужих систем: transliterateText и флаг в init.
Панель и ночной прогон
Пока сидите у Studio, панель удобна. Когда скрипт идёт из расписания в трее, панель никто не читает — обязателен файл или SQLite.
Пишите три якоря: старт (URL, get_port), середина (сколько строк/писем, путь файла), конец («готово» или шаг, на котором остановились). Без конца в журнале не отличить «ещё работает» от «процесс убили».
$logger->info("старт", array("port" => $app->get_port()));
$input->wait_element_exist_by_name("q");
$logger->info("форма на месте");
$logger->info("готово");
Две копии Studio — разные пути логов. Иначе утром не понять, чей прогон.
SQLite
Имеет смысл, когда робот крутится неделями: текстовый файл на сотни мегабайт неудобно фильтровать.
- addLogToSQLite
- getLogByIdFromSQLite
- getLogsByLevelFromSQLite / getLogsByLevelsFromSQLite
- getLogsByPeriodFromSQLite / getLogsByMessageFromSQLite / getLogsByCallerFromSQLite
- Счётчики: getLogCountByLevelFromSQLite, getTotalLogCountFromSQLite
- Чистка: deleteLogsByPeriodFromSQLite
Раз в неделю удаляйте старые дни, иначе база раздуется так же, как файл.
Экспорт
exportAllLogsFromDbSQLiteToCsv — отдать в Excel. exportLogsByPeriodFromSQLiteToTextFile — текст или HTML за период. Удобно приложить к письму «что сделал робот вчера» через IMAP/SMTP или Outlook.
Не экспортируйте за год «на всякий случай»: сначала getLogsByPeriodFromSQLite / getLogCountByLevelFromSQLite, потом выгрузка. Старые дни чистите deleteLogsByPeriodFromSQLite.
FAQ
В панели пусто. writeLogToLogPanel = false или уровень сообщения ниже минимума init.
Файл не создаётся. Нет папки, нет прав, путь с несуществующим диском. Создайте C:\bots\logs заранее.
Две Studio пишут в один sqlite. Разведите пути. Это не блокировка «на двоих», это каша в отчёте.
В логе «navigate ok», клика не было. Сообщение написали до wait. Перенесите info после успешного exists.
Файл на гигабайт. Минимум уровня слишком низкий (trace/debug на бою) или пишете HTML страницы целиком. Режьте данные, чистите период, не кладите сырой DOM в каждую строку.
Поиск: logger.