CGI: перенаправление STDERR в файл с изменением - PullRequest
3 голосов
/ 11 октября 2019

Перенаправление STDERR во внешний файл довольно просто

my $stderr = '/home/logs/stderr.log.txt';
open STDERR, '>' . $stderr;
...
$_ = 1/0; # Error: Illegal division by zero

Чтобы сделать этот файл журнала ошибок более читабельным, я хочу предварять метку времени каждый раз, когда она отправляетсяSTDERR.

Как этого достичь?

1 Ответ

3 голосов
/ 11 октября 2019

Самый простой способ без особых помех для остального кода - использовать связанные файловые дескрипторы. Связанные файловые дескрипторы позволяют вам писать настраиваемые функции, которые вызываются, когда ваш файловый дескриптор читается, записывается или выполняет какие-либо другие операции с ним.

Подтверждение концепции

package TimeStamper;
sub TIEHANDLE {
   my ($pkg,$file) = @_;
   open my $fh, ">", $file;  # the "real" filehandle
   return bless [$fh],$pkg;
}
sub PRINT {
   my ($self,@msg) = @_;
   print {$self->[0]} "[",scalar localtime,"] ",@msg;
}

package main;
my $stderr = "/home/logs/stderr.log.txt";
tie *STDERR, "TimeStamper", $stderr;

print STDERR "Hello world\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...