The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Dancer::Logger::Pipe;

use strict;
use warnings;
use Carp;
use base 'Dancer::Logger::Abstract';
use Dancer::Config 'setting';
use IO::Handle;

our $VERSION = '0.01';

sub init {
    my ($self) = @_;

    my $pipe    = setting('pipe')  || croak "Missing pipe settings";
    my $command = $pipe->{command} || croak "Missing pipe command setting";

    open( my $fh, '|-', $command)
        || croak "Unable to open pipe: $!";

    $fh->autoflush(1);

    $self->{fh}          = $fh;
}

sub _log {
    my ( $self, $level, $message ) = @_;
    my $fh = $self->{fh};

    return unless ref $fh && $fh->opened;

    $fh->print( $self->format_message( $level => $message ) )
        or carp "writing logs to pipe failed: $!";
}

1;

__END__

=head1 NAME

Dancer::Logger::Pipe - pipe-based logging engine for Dancer

=head1 SYNOPSIS

Used to pipe the logs from Dancer. This requires some additional settings.

  logger: pipe
  pipe:
    command:     "/usr/bin/cronolog /var/log/dancer/%Y/%m/%d/dancer.log"

=head1 DESCRIPTION

This is a pipe-based logging engine that allows you to pipe your log output

=head1 METHODS

=head2 init

This method is called when C<< ->new() >> is called.
It opens the pipe for writing.

=head2 _log

Writes the log message to the pipe.

=head1 AUTHOR

Moshe Good

=head1 LICENSE AND COPYRIGHT

Copyright 2010 Moshe Good.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.