2013-09-02 4 views
3

Мы отправляем много сообщений syslog из нашего скрипта perls, используя код объекта local2. Это очень хорошо работает в Red Hat, но на SunOS сообщения не отображаются в local2. Например, здесь есть минимальный сценарийОтправка сообщений syslog из perl

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

ответ

3

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

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

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

Смежные вопросы