【Perl】 続・Log::Dispatchで、TCP経由でsyslogを送信する際の注意点
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
以前ご紹介した内容について、Sys::Syslogの最近のアップデートにより、setlogsock
サブルーチンへの引数にポート番号を渡した場合には、getservbyname
関数を使わず、渡されたポート番号を使用するよう修正されています。これにより、Sys::Syslogへ前回ご紹介したパッチ当てを行わなくても、スクリプト側の軽微な修正でsyslogを送信することができます。
修正後のスクリプトは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/usr/bin/env perl use strict; use warnings; use File::Basename 'basename'; use Getopt::Long; use Log::Dispatch; our $VERSION = 0.02; our $DEF_HOST = 'localhost'; our $DEF_PROTO = 'udp'; our $DEF_FAC = 'user.notice'; our $DEF_PORT = 514; my $prog = basename($0); my $usage = << "END_OF_USAGE"; USAGE: $prog [-d DESTINATION] [-p PROTOCOL] [-f FACILITY.PRIORITY] MESSAGE OPTIONS: -d|--destination ip address or hostname (default '$DEF_HOST') -p|--protocol tcp or udp (default '$DEF_PROTO') -f|--facility facility.priority (default '$DEF_FAC') -h|--help this message (which you're reading) -v|--version show version END_OF_USAGE my $opts_are_parsed = GetOptions( "destination=s" => \my $dest, "protocol=s" => \my $proto, "facility=s" => \my $fac, "help" => \my $show_help, "version" => \my $show_version, ); $dest //= $DEF_HOST; $proto //= $DEF_PROTO; $fac //= $DEF_FAC; my $message = shift; if (not $opts_are_parsed or $show_help or $proto !~ /tcp|udp/ or $fac !~ /\w+\.\w+/ or not defined $message) { die $usage; } elsif ($show_version) { die "$prog: VERSION $VERSION\n"; } my ($facility, $priority) = split /\./, $fac; my $logger = Log::Dispatch->new( outputs => [ [ 'Syslog' => ( min_level => 'debug', facility => $facility, socket => [ { type => $proto, host => $dest, port => $DEF_PORT, } ], ) ], ], ); eval { $logger->$priority($message); }; if ($@) { die "$prog: failed to send syslog: invalid facility/priority.\n"; } __END__ |
修正内容としては、Log::Dispatchをnew
する際に渡す引数のうちのハッシュキーsocket
の値を、これまでの配列リファレンスからハッシュレフ(を配列リファレンスの第1要素にしたもの)へ変更し、そのハッシュレフのport
キーにポート番号(514)を割り当てています。
以下はスクリプトの実行結果です。
1 2 3 4 5 6 7 |
(source host) $ ./logtrans.pl -d 192.168.11.114 hello_udp $ ./logtrans.pl -d 192.168.11.114 -p tcp hello_tcp (destination host) Aug 19 14:35:54 node115 ./logtrans.pl: hello_udp Aug 19 14:36:00 node115 ./logtrans.pl: hello_tcp |
正しくsyslogが送信されていることが確認できました。
以上、Perlでのsyslog送信に関する簡単な話題をご紹介しました。