что мне надо от логов:
1) конешно выводить точку запуска + время в каждом запускаемом логе + дополнительная инфа, как правило у разных проектов она разная.
2) выводить не только сроку, но и более сложную структуру.
3) разные функции для логов ( info, error, debug,trace) чтоб на внешнем серваке отказываться от определенных из них, причем делать этот без потери скорости.
sub _log{
my ($self,$type,$text,$cl) = @_;
my @tt = localtime;
my ($pack,$filename,$line) = caller(1);
my ($topack,$tofile,$toline) = caller($cl) if($cl);
$line = "($type)".POSIX::strftime("%d,%h %H:%M:%S",localtime)." $filename($line) ";
if($cl){
my ($topack,$tofile,$toline) = caller($cl) ;
$line.= "{$tofile($toline)}";
}
# тут линию можно дополнить своими
open my $fh,'>>'.MyProject::Conf::LOGFILE;
print $fh $line.$text."\n";
close $fh;
}
my $alog = MyProject::Conf::LOGS;
my $clog = MyProject::Conf::CLOGS;
no strict 'refs';
foreach my $ll (@$alog){
my $method = lc $ll;
if(grep {$_ eq $ll} @$clog){
*{$method} = sub{my $self = shift; $self->_log($ll,@_)};
*{$method.'_dump'} = sub{my $self = shift; my $text = shift; my $data = shift; $self->_log($ll,$text.':'.Dumper($data),@_)}
}else{
*{$method} = sub{};
*{$method.'_dump'} = sub{};
}
}
немного по коду… MyProject::Conf::LOGFILE – тут просто лежит абсолютный путь к файлу логов.
MyProject::Conf::LOGS – тут лежит массив имен всех доступных логов, я использую ['INFO','DEBUG','DERROR','TRACE']
MyProject::Conf::CLOGS – массив логов которые необходимо выводить. Так я сделал потому, что не в се используемые логи необходимо выводить в данном запуске проекта.
цикл идущий после no strict ‘refs’;
просто заполняет функции. имен всех функций переводятся в нижний регистр. + добавляется еще и функция dump, для info она будет info_dump, которая кроме передой строки, в лог еще запишет передаваемую структуру, выводимую с помощью Data::Dumper
Recent Comments