Отправка сообщений системного журнала от Perl
Мы отправляем много сообщений системного журнала из нашего скрипта perls, используя код объекта local2. Это очень хорошо работает в Red Hat, но в SunOS сообщения не отправляются на local2. Например, вот минимальный скрипт
#!/usr/bin/perl
use strict;
use warnings;
use Sys::Syslog qw(:DEFAULT :standard :macros);
openlog("", 'ndelay', 'local2');
syslog('info', "ItWorks");
`logger -p local2.info "ItWorks"`;
В этом сценарии я отправляю журнал через Perl-модуль Syslog, а также через команду logger. Только второе сообщение появляется для перехода на local2. Причина, по которой я считаю, что это не относится к local2, заключается в том, что у нас есть настройка правил в файле syslog.conf для пересылки local2, и только второе сообщение пересылается. Когда я смотрю на 2 сообщения в файле журнала, они выглядят немного по-другому, я не уверен, что это важно
Sep 2 11:41:22 ssapp7001v <150>Sep 2 11:41:22 d336599: ItWorks
Sep 2 11:41:22 ssapp7001v d336599: [ID 702911 local2.info] ItWorks
Я должен также добавить, что я пробовал различные комбинации в perl-коде использования local2 как строки, как константы, указав ее в вызове openlog и / или в вызове syslog. Ничто из этого не имеет никакого значения. Я мог бы просто использовать обратные пометки и регистратор вызовов, но это мое последнее средство, потому что мне приходится иметь дело с символами, которые могут быть неудобны для командной строки, а также с повышением производительности при открытии нового процесса для каждого сообщения журнала. К сожалению, никаких изменений конфигурации на этом сервере не может быть и речи.
1 ответ
Похоже, у модуля системного журнала Perl есть некоторые проблемы с SunOS. Эти проблемы могли бы быть исправлены, но для меня обновление не вариант, так как этот сервер принадлежит другому отделу компании. В итоге я просто использовал утилиту командной строки logger. Это далеко от идеала, но работает. Код здесь закрывает регистратор для каждого вызова, но его можно легко оставить открытым. Проблема с его сохранением в том, что вы не можете изменить серьезность.
open(my $fh, "| logger -p $facility.$severityName");
print $fh $logmsg . "\n";
close($fh);
Другой вариант - вызвать API syslog, но я немного об этом и мне просто нужно что-то, что работает на этом этапе:-)