Log::UDP::Client - A simple way to send structured log messages via UDP


Log-UDP-Client documentation Contained in the Log-UDP-Client distribution.

Index


Code Index:

NAME

Top

Log::UDP::Client - A simple way to send structured log messages via UDP

VERSION

Top

version 0.20.0

SYNOPSIS

Top

    use Log::UDP::Client;

    # Send the simple scalar to the server
    Log::UDP::Client->new->send("Hi");

    # Log lots of messages
    my $logger = Log::UDP::Client->new(server_port => 15000);
    my $counter=0;
    while(++$counter) {
        $logger->send($counter);
        last if $counter >= 1000;
    }

    # Send some debugging info
    $logger->send({
        pid     => $$,
        program => $0,
        args    => \@ARGV,
    });

    # Use of JSON serializer
    my $logger = Log::UDP::Client->new( serializer_module => 'JSON' );

    # Will emit { "message" => "Hi" } because JSON want to wrap stuff into a hashref
    $logger->send("Hi");

    # Use of custom serializer
    use Storable qw(freeze);
    my $logger = Log::UDP::Client->new (
        serializer => sub {
            return nfreeze( \( $_[0] ) );
        },
    );

DESCRIPTION

Top

This module enables you to send a message (simple string or complicated object) over an UDP socket to a listening server. The message will be encoded with a serializer module (default is Storable).

ATTRIBUTES

Top

server_address : Str

IP address or hostname for the server you want to send the messages to. This field can be changed after instantiation. Default is 127.0.0.1.

server_port : Int

Port for the server you plan to send the messages to. This field can be changed after instantiation. Default is port 9999.

throws_exception : Bool

If errors are encountered, should we throw exception or just return? Default is return. Set to true for exceptions. You can change this flag after instantiation.

socket : IO::Socket::INET

Read-only field that contains the socket used to send the messages.

METHODS

Top

send($message)

Instance method that actually encodes and transmits the specified message over UDP to the listening server. Will die if throw_exception is set to true and some kind of transmission error occurs. The message will be serialized by the instance-defined serializer. Returns true on success.

INHERITED METHODS

Top

All of these methods are inherited from Data::Serializable. Read more about them there.

SEE ALSO

Top

SUPPORT

Top

You can find documentation for this module with the perldoc command.

  perldoc Log::UDP::Client

Websites

Bugs

Please report any bugs or feature requests to bug-log-udp-client at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Log-UDP-Client. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

AUTHOR

Top

Robin Smidsrød <robin@smidsrod.no>

COPYRIGHT AND LICENSE

Top


Log-UDP-Client documentation Contained in the Log-UDP-Client distribution.

use strict;
use warnings;
use 5.006; # Found with Perl::MinimumVersion

package Log::UDP::Client;
BEGIN {
  $Log::UDP::Client::VERSION = '0.20.0';
}
use Moose;
with 'Data::Serializable' => { -version => '0.40.0' };

# ABSTRACT: A simple way to send structured log messages via UDP

use IO::Socket::INET ();
use Carp qw(carp croak);


has "server_address" => (
    is      => 'rw',
    isa     => 'Str',
    default => sub { "127.0.0.1"; },
);


has "server_port" => (
    is      => 'rw',
    isa     => 'Int',
    default => sub { 9999; }
);


has "throws_exception" => (
    is      => 'rw',
    isa     => 'Bool',
    default => 0,
);


has "socket" => (
    is      => 'ro',
    isa     => 'IO::Socket::INET',
    lazy    => 1,
    default => sub { IO::Socket::INET->new( Proto => 'udp' ); }
);


# Perl::Critic bug: Subroutines::RequireArgUnpacking shouldn't be needed here
## no critic qw(Subroutines::ProhibitBuiltinHomonyms Subroutines::RequireArgUnpacking)
sub send {
    my ($self, $message) = @_;

    # Make sure message was specified
    if ( @_ < 2 ) {
        croak("Please specify message") if $self->throws_exception;
        return; # FAIL
    }

    # Use the specified serializer to encode the message in a binary format
    my $serialized_message = $self->serialize( $message );

    # Trap failure in serialization when not emitting exceptions
    if ( not $self->throws_exception and not defined($serialized_message) ) {
        return; # FAIL
    }

    # Send UDP message
    my $length = CORE::send(
        $self->socket,
        $serialized_message,
        0,
        IO::Socket::INET::pack_sockaddr_in(
            $self->server_port,
            IO::Socket::INET::inet_aton( $self->server_address )
        )
    );

    # Check for transmission error
    if ( $length != length($serialized_message) ) {
        my $error = "Couldn't send message: $!\n";
        croak($error) if $self->throws_exception;
        carp($error);
        return 0;
    }

    # Everything OK
    return 1;

}

1;




__END__