Используется практически всеми скриптами NoDeny и предназначен для ведения логов и вывода отладочных сообщений. Загружается самым первым, чтобы в случае критической ошибки, вывести ее в удобном и понятном виде.
Вначале вам не обязательно знать все нюансы этого модуля, фактически в 99% случаев вы будете его использовать так:
debug('Сообщение');
В админке это сообщение появится в debug-области и будет доступно при нажатии на кнопку Debug под эмблемой сети.
debug('Запускаем проверку балансов');
debug('error', 'Ошибка!');
debug('warn', "Предупреждение. У клиента uid = $uid отрицательный баланс");
debug('Dump переменной $obj: ', $obj, ' - вот так!');
debug(\%hash);
В примерах мы посылаем сообщения в основной Debug. Если необходимо вести несколько debug-ов/логов (врядли вам понадобится) - необходимо создать отдельный debug-объект:
my $debug1 = Debug->new;
my $debug2 = Debug->new;
$debug1->add('start');
$debug2->add('creating connection');
$debug2->add('connection object info:', $connection);
Debug может работать в 3 режимах: web, консоль и файл. По умолчанию включен web-режим. В этом режиме данные сохраняются внутри debug-объекта и никуда не выводятся. Вывод осуществляется по команде:
my $html = Debug->show;
Этим произойдет формирование html-фрагмента с текущим debug.
В NoDeny web-интерфейсе debug включен всегда. По мере выполнения скриптов он заполняется данными. По завершению выполнения, debug либо уничтожается либо рендерится (Debug->show) и посылается суперадминистратору. Несмотря на то, что для не суперадминистратора debug уничтожается, он все равно ведется, чтобы в случае критической ошибки все события были записаны в файл для дальнейшего изучения суперадминистратором. В этом случае web-интерфейс поступает подобным образом:
Debug->param( -type=>'file', -file=>$cfg::debug_log, -nochain=>0 );
Debug->show; # весь накопленный debug выводим в файл
Параметры Debug объекта, задаются методом param либо при создании объекта методом new:
-type : тип debug (file/console/web)
-file : имя файла для -type = file
-drop_chain : 1 - не выводить цепочку подпрограмм для каждого сообщения (только для -type = file/console )
-only_log : 1 - заставит вести дебаг только при вызове подпрограммы tolog(), debug() будет игнорироваться
Для демонстрации, создайте файл ping.pl, вставьте в него следующий код и запустите на выполнение:
use Debug;
# set 0 for datail log
my $mode = 0;
my $log = Debug->new(
-type => 'file',
-file => 'debug.txt',
-drop_chain => $mode,
-only_log => $mode,
);
$log->tolog('ping start');
$log->debug("ping:", `ping -c3 127.0.0.1`);
$log->tolog('ping end');
Результат смотрите в файле debug.txt.
С момента установки type = file/console, все последующие данные автоматически выводятся в файл/консоль, т.е. метод show вызывать не требуется.
В методах debug/tolog/add/insert первым параметром может идти одно из зарезервированных слов:
error : данное сообщение описывает ошибку
warn : данное сообщение описывает предупреждение
pre : сохранить форматирование
head : сообщение является заголовком
В случае 'error', debug-объект увеличивает свой внутренний счетчик ошибок:
....
$error_msg && debug('error', $error_msg);
....
$error_msg && debug('error', $error_msg);
....
if( Debug->errors > 0)
{ # произошло Debug->errors ошибок
rollback;
}
Html, полученный методом show, содержит css стили, а также уникальны идентификаторы DOM, т.е допускается вывод нескольких debug в один html.
Дебаг в web-режиме обнулятся после накопления 1000 сообщений.
Для переключения дебага в многопоточный режим, необходимо использовать метод threaded:
use threads;
use threads::shared;
use Debug;
Debug->param( -type=>'console' );
Debug->threaded;
threads->create( \&thread1 )->join();
threads->create( \&thread2 )->join();
sub thread1
{
debug("thread 1: $_"), sleep 1 foreach( 1..3);
}
sub thread2
{
debug("thread 2: $_"), sleep 1 foreach( 1..3);
}
Модуль debug-а предоставляет некоторые полезные возможности, например, формирование дампа переменных/объектов:
use Debug;
my $obj = { one => 1, two => 2 };
my $dump = Debug->dump( $obj );
print $dump."\n";
Debug->dump использует Data::Dumper, т.е. вы можете не подгружать Data::Dumper явно через use, а использовать Debug.