The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Log::Any::For::LWP;

use 5.010001;
use strict;
use warnings;
use Log::Any '$log';

our $VERSION = '0.05'; # VERSION

use Net::HTTP::Methods::Patch::LogRequest    qw();
use LWP::UserAgent::Patch::LogRequestContent qw();
use LWP::UserAgent::Patch::LogResponse       qw();

my %opts;

sub import {
    my $self = shift;
    %opts = @_;
    $opts{-log_request_header}   //= 1;
    $opts{-log_request_body}     //= 0;
    $opts{-log_response_header}  //= 1;
    $opts{-log_response_body}    //= 0;
    $opts{-decode_response_body} //= 1;

    Net::HTTP::Methods::Patch::LogRequest->import()
          if $opts{-log_request_header};
    LWP::UserAgent::Patch::LogRequestContent->import()
          if $opts{-log_request_body};
    LWP::UserAgent::Patch::LogResponse->import(
        -warn_target_loaded   => 0,
        -log_response_header  => $opts{-log_response_header},
        -log_response_body    => $opts{-log_response_body},
        -decode_response_body => $opts{-decode_response_body},
    );
}

sub unimport {
    LWP::UserAgent::Patch::LogResponse->unimport();
    LWP::UserAgent::Patch::LogRequestContent->unimport()
          if $opts{-log_request_body};
    Net::HTTP::Methods::Patch::LogRequest->unimport()
          if $opts{-log_request_header};
}

1;
# ABSTRACT: Add logging to LWP


__END__
=pod

=head1 NAME

Log::Any::For::LWP - Add logging to LWP

=head1 VERSION

version 0.05

=head1 SYNOPSIS

 use Log::Any::For::LWP
     -log_request_header   => 1, # optional, default 1 (turn on Net::HTTP::Methods::Patch::LogRequest)
     -log_request_body     => 1, # optional, default 0 (turn on LWP::UserAgent::Patch::LogRequestContent)
     -log_response_header  => 1, # optional, default 1 (turn on LWP::UserAgent::Patch::LogResponse)
     -log_response_body    => 1, # optional, default 0 (turn on LWP::UserAgent::Patch::LogResponse)
     -decode_response_body => 1, # optional, default 1 (passed to LWP::UserAgent::Patch::LogResponse)
 ;

Sample script and output:

 % TRACE=1 perl -MLog::Any::App -MLog::Any::For::LWP -MLWP::Simple \
   -e'get "http://www.google.com/"'
 [36] HTTP request (proto=http, len=134):
 GET / HTTP/1.1
 TE: deflate,gzip;q=0.3
 Connection: TE, close
 Host: www.google.com
 User-Agent: LWP::Simple/6.00 libwww-perl/6.04

 [79] HTTP response header:
 302 Moved Temporarily
 Cache-Control: private
 Connection: close
 Date: Tue, 17 Jul 2012 04:39:10 GMT
 ...

 [81] HTTP request (proto=http, len=136):
 GET / HTTP/1.1
 TE: deflate,gzip;q=0.3
 Connection: TE, close
 Host: www.google.co.id
 User-Agent: LWP::Simple/6.00 libwww-perl/6.04

 [190] HTTP response header:
 200 OK
 Cache-Control: private, max-age=0
 Connection: close
 Date: Tue, 17 Jul 2012 04:39:10 GMT
 ...

=head1 DESCRIPTION

This module just bundles L<Net::HTTP::Methods::Patch::LogRequest>,
L<LWP::UserAgent::Patch::LogRequestContent>, and
L<LWP::UserAgent::Patch::LogResponse> together.

Response body is dumped to a separate category. It is recommended that you dump
this to a directory, for convenience. See the documentation of
L<LWP::UserAgent::Patch::LogResponse> for more details.

=for Pod::Coverage ^(unimport)$

=head1 SEE ALSO

L<Log::Any>

=head1 AUTHOR

Steven Haryanto <stevenharyanto@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by Steven Haryanto.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut