Отправка сообщений системного журнала из 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. Ничто из этого, кажется, не имеет никакого значения. Я мог бы просто использовать обратные кавычки и регистратор вызовов, но это мое последнее средство, потому что тогда мне приходится иметь дело с символами, которые могут быть неудобными для командной строки, а также с падением производительности при открытии нового процесса для каждого сообщения журнала. К сожалению, о каких-либо изменениях конфигурации на этом сервере не может быть и речи.


person MikeKulls    schedule 02.09.2013    source источник


Ответы (1)


Похоже, что модуль системного журнала Perl имеет некоторые проблемы в SunOS. Эти проблемы могли быть исправлены, но для меня обновление не вариант, так как этот сервер принадлежит другому отделу компании. В итоге я просто использовал утилиту командной строки logger. Это далеко не идеально, но работает. Код здесь закрывает регистратор для каждого вызова, но его можно легко оставить открытым. Проблема с тем, чтобы оставить его открытым, заключается в том, что вы не можете изменить серьезность.

open(my $fh, "| logger -p $facility.$severityName");
print $fh $logmsg . "\n";
close($fh);

Другим вариантом будет вызов syslog API, но я немного переборщил с этим и мне просто нужно что-то, что работает на данном этапе :-)

person MikeKulls    schedule 09.09.2013