Imported Upstream version 1.09
This commit is contained in:
commit
4b555c3e4d
52
Changes
Normal file
52
Changes
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
HISTORY
|
||||||
|
0.99 Original version; created by h2xs 1.22 with options
|
||||||
|
|
||||||
|
-A
|
||||||
|
-C
|
||||||
|
-X
|
||||||
|
-b5.6.1
|
||||||
|
-nLog::Dispatch::File::Rolling
|
||||||
|
--skip-exporter
|
||||||
|
-v0.99
|
||||||
|
|
||||||
|
1.00 Initial coding
|
||||||
|
|
||||||
|
1.01 Someone once said "Never feed them after midnight!"---Ok, let's
|
||||||
|
append: "Never submit any code after midnight..."
|
||||||
|
|
||||||
|
Now it is working, I also included 4 tests.
|
||||||
|
|
||||||
|
1.02 No code change, just updated Makefile.PL to include correct
|
||||||
|
author information and prerequisites.
|
||||||
|
|
||||||
|
1.03 Changed the syntax of the '$' format character because I noticed
|
||||||
|
some problems while making Log::Dispatch::File::Alerts. You need
|
||||||
|
to change your configuration!
|
||||||
|
|
||||||
|
1.04 Got a bug report where the file handle got closed in
|
||||||
|
mid-execution somehow. Added a additional check to re-open it
|
||||||
|
instead of writing to a closed handle.
|
||||||
|
|
||||||
|
1.05 Updated packaging for newer standards. No changes to the coding.
|
||||||
|
|
||||||
|
1.06 Fixed a subtle bug that prevented us from locking the logfile
|
||||||
|
after a fork if no PID was used in the filename.
|
||||||
|
|
||||||
|
Also disabled forced double opening of the logfile at startup.
|
||||||
|
It was in place because I didn't trust Log::Dispatch::File to
|
||||||
|
really open the file at the right moment.
|
||||||
|
|
||||||
|
Thanks to Peter Lobsinger for the patch. Please always wrap
|
||||||
|
non-standard Test::* modules in eval and make your testfile
|
||||||
|
clean up after itself... ;)
|
||||||
|
|
||||||
|
1.07 Fixed rt.cpan.org bug #89001. Seems Log::Dispatch::File changed
|
||||||
|
its initialization procedure---and we are inheriting from it.
|
||||||
|
|
||||||
|
1.08 Fixed dependency on Log::Dispatch::File. The change in 1.07 only
|
||||||
|
works with 2.37 or later. For older versions of
|
||||||
|
Log::Dispatch::File use 1.06.
|
||||||
|
|
||||||
|
1.09 Dependency change of 1.08 was missing from the Makefile.PL.
|
||||||
|
Oops.
|
||||||
|
|
16
MANIFEST
Executable file
16
MANIFEST
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
Makefile.PL
|
||||||
|
MANIFEST
|
||||||
|
README
|
||||||
|
Changes
|
||||||
|
lib/Log/Dispatch/File/Rolling.pm
|
||||||
|
t/1.t
|
||||||
|
t/2.t
|
||||||
|
t/3.t
|
||||||
|
t/4.t
|
||||||
|
t/5.t
|
||||||
|
t/6.t
|
||||||
|
META.yml
|
||||||
|
t/7testpod.t
|
||||||
|
t/8coverage.t
|
||||||
|
t/9reopenfh.t
|
||||||
|
META.json Module JSON meta-data (added by MakeMaker)
|
42
META.json
Normal file
42
META.json
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"abstract" : "Object for logging to date/time/pid stamped files",
|
||||||
|
"author" : [
|
||||||
|
"M. Jacob <jacob@j-e-b.net>"
|
||||||
|
],
|
||||||
|
"dynamic_config" : 1,
|
||||||
|
"generated_by" : "ExtUtils::MakeMaker version 6.86, CPAN::Meta::Converter version 2.120351",
|
||||||
|
"license" : [
|
||||||
|
"perl_5"
|
||||||
|
],
|
||||||
|
"meta-spec" : {
|
||||||
|
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
|
||||||
|
"version" : "2"
|
||||||
|
},
|
||||||
|
"name" : "Log-Dispatch-File-Rolling",
|
||||||
|
"no_index" : {
|
||||||
|
"directory" : [
|
||||||
|
"t",
|
||||||
|
"inc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"prereqs" : {
|
||||||
|
"build" : {
|
||||||
|
"requires" : {
|
||||||
|
"ExtUtils::MakeMaker" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"configure" : {
|
||||||
|
"requires" : {
|
||||||
|
"ExtUtils::MakeMaker" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime" : {
|
||||||
|
"requires" : {
|
||||||
|
"Log::Dispatch" : "2.37",
|
||||||
|
"Log::Log4perl" : "0.32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"release_status" : "stable",
|
||||||
|
"version" : "1.09"
|
||||||
|
}
|
23
META.yml
Normal file
23
META.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
abstract: 'Object for logging to date/time/pid stamped files'
|
||||||
|
author:
|
||||||
|
- 'M. Jacob <jacob@j-e-b.net>'
|
||||||
|
build_requires:
|
||||||
|
ExtUtils::MakeMaker: 0
|
||||||
|
configure_requires:
|
||||||
|
ExtUtils::MakeMaker: 0
|
||||||
|
dynamic_config: 1
|
||||||
|
generated_by: 'ExtUtils::MakeMaker version 6.86, CPAN::Meta::Converter version 2.120351'
|
||||||
|
license: perl
|
||||||
|
meta-spec:
|
||||||
|
url: http://module-build.sourceforge.net/META-spec-v1.4.html
|
||||||
|
version: 1.4
|
||||||
|
name: Log-Dispatch-File-Rolling
|
||||||
|
no_index:
|
||||||
|
directory:
|
||||||
|
- t
|
||||||
|
- inc
|
||||||
|
requires:
|
||||||
|
Log::Dispatch: 2.37
|
||||||
|
Log::Log4perl: 0.32
|
||||||
|
version: 1.09
|
25
Makefile.PL
Executable file
25
Makefile.PL
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
use 5.006001;
|
||||||
|
use ExtUtils::MakeMaker;
|
||||||
|
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||||
|
# the contents of the Makefile that is written.
|
||||||
|
WriteMakefile(
|
||||||
|
'NAME' => 'Log::Dispatch::File::Rolling',
|
||||||
|
'VERSION_FROM' => 'lib/Log/Dispatch/File/Rolling.pm', # finds $VERSION
|
||||||
|
'PREREQ_PM' => {
|
||||||
|
'Log::Log4perl' => '0.32',
|
||||||
|
'Log::Dispatch' => '2.37',
|
||||||
|
# 'Pod::Readme' => '0.05', # only needed for 'make dist'
|
||||||
|
},
|
||||||
|
($] >= 5.005 ? ( ## Add these new keywords supported since 5.005
|
||||||
|
ABSTRACT_FROM => 'lib/Log/Dispatch/File/Rolling.pm', # retrieve abstract from module
|
||||||
|
AUTHOR => 'M. Jacob <jacob@j-e-b.net>') : (),
|
||||||
|
LICENSE => 'perl',
|
||||||
|
depend => {
|
||||||
|
create_distdir => 'Changes',
|
||||||
|
Changes => 'lib/Log/Dispatch/File/Rolling.pm'."\n\t".q[$(FULLPERLRUN) -MPod::Readme -e 'Pod::Readme->new( readme_type => "changes" )->parse_from_file( "lib/Log/Dispatch/File/Rolling.pm", "Changes" )']."\n\n",
|
||||||
|
},
|
||||||
|
realclean => {
|
||||||
|
FILES => "Changes"
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
79
README
Executable file
79
README
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
Log/Dispatch/File/Rolling version 1.09
|
||||||
|
======================================
|
||||||
|
|
||||||
|
--------
|
||||||
|
Abstract
|
||||||
|
--------
|
||||||
|
|
||||||
|
This module subclasses Log::Dispatch::File for logging to date/time
|
||||||
|
stamped files. It uses flock to ensure being safe in a multitasking
|
||||||
|
environment. It recognizes a fork() and will reopen the logfile, if
|
||||||
|
configured so even with a process specific filename.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
This module requires Log::Dispatch::File, included in the Log::Dispatch
|
||||||
|
distribution and Log::Log4perl::DateFormat, included in the
|
||||||
|
Log::Log4perl distribution. It has only be tested with the versions as
|
||||||
|
stated in Makefile.PL, if you find it works with earlier versions, too,
|
||||||
|
please send me a email. Thank you.
|
||||||
|
|
||||||
|
------------------
|
||||||
|
Basic Installation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Log::Dispatch::File::Rolling may be installed through the CPAN shell in
|
||||||
|
the usual manner:
|
||||||
|
|
||||||
|
# perl -MCPAN -e 'install Log::Dispatch::File::Rolling'
|
||||||
|
|
||||||
|
You can also read this README from the CPAN shell:
|
||||||
|
|
||||||
|
# perl -MCPAN -e shell
|
||||||
|
cpan> readme Log::Dispatch::File::Rolling
|
||||||
|
|
||||||
|
And you can install the component from the CPAN prompt as well:
|
||||||
|
|
||||||
|
cpan> install Log::Dispatch::File::Rolling
|
||||||
|
|
||||||
|
-------------------
|
||||||
|
Manual Installation
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Log::Dispatch::File::Rolling can also be installed manually. The latest
|
||||||
|
CPAN version can be found at <http://www.cpan.org/modules/by-
|
||||||
|
authors/id/J/JA/JACOB/> or in a similarly named directory at your
|
||||||
|
favorite CPAN mirror.
|
||||||
|
|
||||||
|
Downloading and unpacking the distribution are left as exercises for the
|
||||||
|
reader. To build and test it:
|
||||||
|
|
||||||
|
perl Makefile.PL
|
||||||
|
make test
|
||||||
|
|
||||||
|
When you're ready to install the component:
|
||||||
|
|
||||||
|
make install
|
||||||
|
|
||||||
|
It should now be ready to use.
|
||||||
|
|
||||||
|
On Win32 systems, replace "make" in the above commands with "nmake". The
|
||||||
|
nmake utility can be downloaded from
|
||||||
|
http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-
|
||||||
|
US/Nmake15.exe
|
||||||
|
|
||||||
|
---------------------
|
||||||
|
COPYRIGHT AND LICENCE
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Copyright (C) 2003, 2004, 2007, 2010, 2013 M. Jacob <jacob@j-e-b.net>
|
||||||
|
|
||||||
|
Based on:
|
||||||
|
Log::Dispatch::File::Stamped by Eric Cholet <cholet@logilune.com>
|
||||||
|
Log::Dispatch::FileRotate by Mark Pfeiffer, <markpf@mlp-consulting.com.au>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the same terms as Perl itself.
|
||||||
|
|
328
lib/Log/Dispatch/File/Rolling.pm
Executable file
328
lib/Log/Dispatch/File/Rolling.pm
Executable file
@ -0,0 +1,328 @@
|
|||||||
|
## no critic
|
||||||
|
package Log::Dispatch::File::Rolling;
|
||||||
|
|
||||||
|
use 5.006001;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Log::Dispatch::File '2.37';
|
||||||
|
use Log::Log4perl::DateFormat;
|
||||||
|
use Fcntl ':flock'; # import LOCK_* constants
|
||||||
|
|
||||||
|
our @ISA = qw(Log::Dispatch::File);
|
||||||
|
|
||||||
|
our $VERSION = '1.09';
|
||||||
|
|
||||||
|
our $TIME_HIRES_AVAILABLE = undef;
|
||||||
|
|
||||||
|
BEGIN { # borrowed from Log::Log4perl::Layout::PatternLayout, Thanks!
|
||||||
|
# Check if we've got Time::HiRes. If not, don't make a big fuss,
|
||||||
|
# just set a flag so we know later on that we can't have fine-grained
|
||||||
|
# time stamps
|
||||||
|
|
||||||
|
eval { require Time::HiRes; };
|
||||||
|
if ($@) {
|
||||||
|
$TIME_HIRES_AVAILABLE = 0;
|
||||||
|
} else {
|
||||||
|
$TIME_HIRES_AVAILABLE = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Preloaded methods go here.
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my $proto = shift;
|
||||||
|
my $class = ref $proto || $proto;
|
||||||
|
|
||||||
|
my %p = @_;
|
||||||
|
|
||||||
|
my $self = bless {}, $class;
|
||||||
|
|
||||||
|
# only append mode is supported
|
||||||
|
$p{mode} = 'append';
|
||||||
|
|
||||||
|
# base class initialization
|
||||||
|
$self->_basic_init(%p);
|
||||||
|
|
||||||
|
# split pathname into path, basename, extension
|
||||||
|
if ($p{filename} =~ /^(.*)\%d\{([^\}]*)\}(.*)$/) {
|
||||||
|
$self->{rolling_filename_prefix} = $1;
|
||||||
|
$self->{rolling_filename_postfix} = $3;
|
||||||
|
$self->{rolling_filename_format} = Log::Log4perl::DateFormat->new($2);
|
||||||
|
$self->{filename} = $self->_createFilename();
|
||||||
|
} elsif ($p{filename} =~ /^(.*)(\.[^\.]+)$/) {
|
||||||
|
$self->{rolling_filename_prefix} = $1;
|
||||||
|
$self->{rolling_filename_postfix} = $2;
|
||||||
|
$self->{rolling_filename_format} = Log::Log4perl::DateFormat->new('-yyyy-MM-dd');
|
||||||
|
$self->{filename} = $self->_createFilename();
|
||||||
|
} else {
|
||||||
|
$self->{rolling_filename_prefix} = $p{filename};
|
||||||
|
$self->{rolling_filename_postfix} = '';
|
||||||
|
$self->{rolling_filename_format} = Log::Log4perl::DateFormat->new('.yyyy-MM-dd');
|
||||||
|
$self->{filename} = $self->_createFilename();
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->{rolling_fh_pid} = $$;
|
||||||
|
$self->_make_handle();
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub log_message { # parts borrowed from Log::Dispatch::FileRotate, Thanks!
|
||||||
|
my $self = shift;
|
||||||
|
my %p = @_;
|
||||||
|
|
||||||
|
my $filename = $self->_createFilename();
|
||||||
|
if ($filename ne $self->{filename}) {
|
||||||
|
$self->{filename} = $filename;
|
||||||
|
$self->{rolling_fh_pid} = 'x'; # force reopen
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $self->{close} ) {
|
||||||
|
$self->_open_file;
|
||||||
|
$self->_lock();
|
||||||
|
my $fh = $self->{fh};
|
||||||
|
print $fh $p{message};
|
||||||
|
$self->_unlock();
|
||||||
|
close($fh);
|
||||||
|
$self->{fh} = undef;
|
||||||
|
} elsif (defined $self->{fh} and ($self->{rolling_fh_pid}||'') eq $$ and defined fileno $self->{fh}) { # flock won't work after a fork()
|
||||||
|
my $inode = (stat($self->{fh}))[1]; # get real inode
|
||||||
|
my $finode = (stat($self->{filename}))[1]; # Stat the name for comparision
|
||||||
|
if(!defined($finode) || $inode != $finode) { # Oops someone moved things on us. So just reopen our log
|
||||||
|
$self->_open_file;
|
||||||
|
}
|
||||||
|
$self->_lock();
|
||||||
|
my $fh = $self->{fh};
|
||||||
|
print $fh $p{message};
|
||||||
|
$self->_unlock();
|
||||||
|
} else {
|
||||||
|
$self->{rolling_fh_pid} = $$;
|
||||||
|
$self->_open_file;
|
||||||
|
$self->_lock();
|
||||||
|
my $fh = $self->{fh};
|
||||||
|
print $fh $p{message};
|
||||||
|
$self->_unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _lock { # borrowed from Log::Dispatch::FileRotate, Thanks!
|
||||||
|
my $self = shift;
|
||||||
|
flock($self->{fh},LOCK_EX);
|
||||||
|
# Make sure we are at the EOF
|
||||||
|
seek($self->{fh}, 0, 2);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _unlock { # borrowed from Log::Dispatch::FileRotate, Thanks!
|
||||||
|
my $self = shift;
|
||||||
|
flock($self->{fh},LOCK_UN);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _current_time { # borrowed from Log::Log4perl::Layout::PatternLayout, Thanks!
|
||||||
|
# Return secs and optionally msecs if we have Time::HiRes
|
||||||
|
if($TIME_HIRES_AVAILABLE) {
|
||||||
|
return (Time::HiRes::gettimeofday());
|
||||||
|
} else {
|
||||||
|
return (time(), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _createFilename {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->{rolling_filename_prefix}
|
||||||
|
. $self->_format()
|
||||||
|
. $self->{rolling_filename_postfix};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _format {
|
||||||
|
my $self = shift;
|
||||||
|
my $result = $self->{rolling_filename_format}->format($self->_current_time());
|
||||||
|
$result =~ s/(\$+)/sprintf('%0'.length($1).'.'.length($1).'u', $$)/eg;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=for changes stop
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Log::Dispatch::File::Rolling - Object for logging to date/time/pid
|
||||||
|
stamped files
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
|
||||||
|
my $file = Log::Dispatch::File::Rolling->new(
|
||||||
|
name => 'file1',
|
||||||
|
min_level => 'info',
|
||||||
|
filename => 'Somefile%d{yyyyMMdd}.log',
|
||||||
|
mode => 'append' );
|
||||||
|
|
||||||
|
$file->log( level => 'emerg',
|
||||||
|
message => "I've fallen and I can't get up\n" );
|
||||||
|
|
||||||
|
=head1 ABSTRACT
|
||||||
|
|
||||||
|
This module provides an object for logging to files under the
|
||||||
|
Log::Dispatch::* system.
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This module subclasses Log::Dispatch::File for logging to date/time
|
||||||
|
stamped files. See L<Log::Dispatch::File> for instructions on usage.
|
||||||
|
This module differs only on the following three points:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item fork()-safe
|
||||||
|
|
||||||
|
This module will close and re-open the logfile after a fork.
|
||||||
|
|
||||||
|
=item multitasking-safe
|
||||||
|
|
||||||
|
This module uses flock() to lock the file while writing to it.
|
||||||
|
|
||||||
|
=item stamped filenames
|
||||||
|
|
||||||
|
This module supports a special tag in the filename that will expand to
|
||||||
|
the current date/time/pid.
|
||||||
|
|
||||||
|
It is the same tag Log::Log4perl::Layout::PatternLayout uses, see
|
||||||
|
L<Log::Log4perl::Layout::PatternLayout>, chapter "Fine-tune the date".
|
||||||
|
In short: Include a "%d{...}" in the filename where "..." is a format
|
||||||
|
string according to the SimpleDateFormat in the Java World
|
||||||
|
(http://java.sun.com/j2se/1.3/docs/api/java/text/SimpleDateFormat.html).
|
||||||
|
See also L<Log::Log4perl::DateFormat> for information about further
|
||||||
|
restrictions.
|
||||||
|
|
||||||
|
In addition to the format provided by Log::Log4perl::DateFormat this
|
||||||
|
module also supports '$' for inserting the PID. Repeat the character to
|
||||||
|
define how many character wide the field should be. This should not be
|
||||||
|
needed regularly as this module also supports logfile sharing between
|
||||||
|
processes, but if you've got a high load on your logfile or a system
|
||||||
|
that doesn't support flock()...
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item new()
|
||||||
|
|
||||||
|
See L<Log::Dispatch::File> and chapter DESCRIPTION above.
|
||||||
|
|
||||||
|
=item log_message()
|
||||||
|
|
||||||
|
See L<Log::Dispatch::File> and chapter DESCRIPTION above.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=for changes continue
|
||||||
|
|
||||||
|
=head1 HISTORY
|
||||||
|
|
||||||
|
=over 8
|
||||||
|
|
||||||
|
=item 0.99
|
||||||
|
|
||||||
|
Original version; created by h2xs 1.22 with options
|
||||||
|
|
||||||
|
-A
|
||||||
|
-C
|
||||||
|
-X
|
||||||
|
-b5.6.1
|
||||||
|
-nLog::Dispatch::File::Rolling
|
||||||
|
--skip-exporter
|
||||||
|
-v0.99
|
||||||
|
|
||||||
|
=item 1.00
|
||||||
|
|
||||||
|
Initial coding
|
||||||
|
|
||||||
|
=item 1.01
|
||||||
|
|
||||||
|
Someone once said "Never feed them after midnight!"---Ok, let's append:
|
||||||
|
"Never submit any code after midnight..."
|
||||||
|
|
||||||
|
Now it is working, I also included 4 tests.
|
||||||
|
|
||||||
|
=item 1.02
|
||||||
|
|
||||||
|
No code change, just updated Makefile.PL to include correct author
|
||||||
|
information and prerequisites.
|
||||||
|
|
||||||
|
=item 1.03
|
||||||
|
|
||||||
|
Changed the syntax of the '$' format character because I noticed some
|
||||||
|
problems while making Log::Dispatch::File::Alerts. You need to change
|
||||||
|
your configuration!
|
||||||
|
|
||||||
|
=item 1.04
|
||||||
|
|
||||||
|
Got a bug report where the file handle got closed in mid-execution somehow.
|
||||||
|
Added a additional check to re-open it instead of writing to a closed
|
||||||
|
handle.
|
||||||
|
|
||||||
|
=item 1.05
|
||||||
|
|
||||||
|
Updated packaging for newer standards. No changes to the coding.
|
||||||
|
|
||||||
|
=item 1.06
|
||||||
|
|
||||||
|
Fixed a subtle bug that prevented us from locking the logfile after a fork if no
|
||||||
|
PID was used in the filename.
|
||||||
|
|
||||||
|
Also disabled forced double opening of the logfile at startup. It was in place
|
||||||
|
because I didn't trust L<Log::Dispatch::File> to really open the file at the
|
||||||
|
right moment.
|
||||||
|
|
||||||
|
Thanks to Peter Lobsinger for the patch. Please always wrap non-standard Test::*
|
||||||
|
modules in eval and make your testfile clean up after itself... ;)
|
||||||
|
|
||||||
|
=item 1.07
|
||||||
|
|
||||||
|
Fixed rt.cpan.org bug #89001. Seems L<Log::Dispatch::File> changed its
|
||||||
|
initialization procedure---and we are inheriting from it.
|
||||||
|
|
||||||
|
=item 1.08
|
||||||
|
|
||||||
|
Fixed dependency on L<Log::Dispatch::File>. The change in 1.07 only works with
|
||||||
|
2.37 or later. For older versions of L<Log::Dispatch::File> use 1.06.
|
||||||
|
|
||||||
|
=item 1.09
|
||||||
|
|
||||||
|
Dependency change of 1.08 was missing from the Makefile.PL. Oops.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=for changes stop
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<Log::Dispatch::File>, L<Log::Log4perl::Layout::PatternLayout>,
|
||||||
|
http://java.sun.com/j2se/1.3/docs/api/java/text/SimpleDateFormat.html,
|
||||||
|
L<Log::Log4perl::DateFormat>, 'perldoc -f flock', 'perldoc -f fork'.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
M. Jacob, E<lt>jacob@j-e-b.netE<gt>
|
||||||
|
|
||||||
|
=head1 COPYRIGHT AND LICENSE
|
||||||
|
|
||||||
|
Copyright (C) 2003, 2004, 2007, 2010, 2013 M. Jacob E<lt>jacob@j-e-b.netE<gt>
|
||||||
|
|
||||||
|
Based on:
|
||||||
|
|
||||||
|
Log::Dispatch::File::Stamped by Eric Cholet <cholet@logilune.com>
|
||||||
|
Log::Dispatch::FileRotate by Mark Pfeiffer, <markpf@mlp-consulting.com.au>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify
|
||||||
|
it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
=cut
|
17
t/1.t
Executable file
17
t/1.t
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 1 };
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# Insert your test code below, the Test::More module is use()ed here so read
|
||||||
|
# its man page ( perldoc Test::More ) for help writing this test script.
|
||||||
|
|
18
t/2.t
Executable file
18
t/2.t
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 1 };
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# Insert your test code below, the Test::More module is use()ed here so read
|
||||||
|
# its man page ( perldoc Test::More ) for help writing this test script.
|
||||||
|
|
70
t/3.t
Executable file
70
t/3.t
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 8 };
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################1
|
||||||
|
|
||||||
|
my $dispatcher = Log::Dispatch->new;
|
||||||
|
ok($dispatcher);
|
||||||
|
|
||||||
|
#########################2
|
||||||
|
|
||||||
|
my %params = (
|
||||||
|
name => 'file',
|
||||||
|
min_level => 'debug',
|
||||||
|
filename => 'logfile.txt',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $Rolling = Log::Dispatch::File::Rolling->new(%params);
|
||||||
|
ok($Rolling);
|
||||||
|
|
||||||
|
#########################3
|
||||||
|
|
||||||
|
$dispatcher->add($Rolling);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################4
|
||||||
|
|
||||||
|
my $message = 'logtest id ' . int(rand(9999));
|
||||||
|
|
||||||
|
$dispatcher->log( level => 'info', message => $message );
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################5
|
||||||
|
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################6
|
||||||
|
|
||||||
|
my @logfiles = glob('logfile*.txt');
|
||||||
|
|
||||||
|
ok(scalar(@logfiles) == 1 or scalar(@logfiles) == 2);
|
||||||
|
|
||||||
|
#########################7
|
||||||
|
|
||||||
|
my $content = '';
|
||||||
|
|
||||||
|
foreach my $file (@logfiles) {
|
||||||
|
open F, '<', $file;
|
||||||
|
local $/ = undef;
|
||||||
|
$content .= <F>;
|
||||||
|
close F;
|
||||||
|
unlink $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok($content =~ /$message/);
|
||||||
|
|
||||||
|
#########################8
|
70
t/4.t
Executable file
70
t/4.t
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 8 };
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################1
|
||||||
|
|
||||||
|
my $dispatcher = Log::Dispatch->new;
|
||||||
|
ok($dispatcher);
|
||||||
|
|
||||||
|
#########################2
|
||||||
|
|
||||||
|
my %params = (
|
||||||
|
name => 'file',
|
||||||
|
min_level => 'debug',
|
||||||
|
filename => 'logfile%d{$$}.txt',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $Rolling = Log::Dispatch::File::Rolling->new(%params);
|
||||||
|
ok($Rolling);
|
||||||
|
|
||||||
|
#########################3
|
||||||
|
|
||||||
|
$dispatcher->add($Rolling);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################4
|
||||||
|
|
||||||
|
my $message = 'logtest id ' . int(rand(9999));
|
||||||
|
|
||||||
|
$dispatcher->log( level => 'info', message => $message );
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################5
|
||||||
|
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################6
|
||||||
|
|
||||||
|
my @logfiles = glob("logfile$$.txt");
|
||||||
|
|
||||||
|
ok(scalar(@logfiles) == 1);
|
||||||
|
|
||||||
|
#########################7
|
||||||
|
|
||||||
|
my $content = '';
|
||||||
|
|
||||||
|
foreach my $file (@logfiles) {
|
||||||
|
open F, '<', $file;
|
||||||
|
local $/ = undef;
|
||||||
|
$content .= <F>;
|
||||||
|
close F;
|
||||||
|
unlink $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok($content =~ /$message/);
|
||||||
|
|
||||||
|
#########################8
|
70
t/5.t
Executable file
70
t/5.t
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 8 };
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################1
|
||||||
|
|
||||||
|
my $dispatcher = Log::Dispatch->new;
|
||||||
|
ok($dispatcher);
|
||||||
|
|
||||||
|
#########################2
|
||||||
|
|
||||||
|
my %params = (
|
||||||
|
name => 'file',
|
||||||
|
min_level => 'debug',
|
||||||
|
filename => 'logfile',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $Rolling = Log::Dispatch::File::Rolling->new(%params);
|
||||||
|
ok($Rolling);
|
||||||
|
|
||||||
|
#########################3
|
||||||
|
|
||||||
|
$dispatcher->add($Rolling);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################4
|
||||||
|
|
||||||
|
my $message = 'logtest id ' . int(rand(9999));
|
||||||
|
|
||||||
|
$dispatcher->log( level => 'info', message => $message );
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################5
|
||||||
|
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################6
|
||||||
|
|
||||||
|
my @logfiles = glob("logfile.2*");
|
||||||
|
|
||||||
|
ok(scalar(@logfiles) == 1 or scalar(@logfiles) == 2);
|
||||||
|
|
||||||
|
#########################7
|
||||||
|
|
||||||
|
my $content = '';
|
||||||
|
|
||||||
|
foreach my $file (@logfiles) {
|
||||||
|
open F, '<', $file;
|
||||||
|
local $/ = undef;
|
||||||
|
$content .= <F>;
|
||||||
|
close F;
|
||||||
|
unlink $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok($content =~ /$message/);
|
||||||
|
|
||||||
|
#########################8
|
74
t/6.t
Executable file
74
t/6.t
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# change 'tests => 1' to 'tests => last_test_to_print';
|
||||||
|
|
||||||
|
use Test;
|
||||||
|
BEGIN { plan tests => 9 };
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################1
|
||||||
|
|
||||||
|
my $dispatcher = Log::Dispatch->new;
|
||||||
|
ok($dispatcher);
|
||||||
|
|
||||||
|
#########################2
|
||||||
|
|
||||||
|
my %params = (
|
||||||
|
name => 'file',
|
||||||
|
min_level => 'debug',
|
||||||
|
filename => 'logfile.txt',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $Rolling = Log::Dispatch::File::Rolling->new(%params);
|
||||||
|
ok($Rolling);
|
||||||
|
|
||||||
|
#########################3
|
||||||
|
|
||||||
|
$dispatcher->add($Rolling);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################4
|
||||||
|
|
||||||
|
my $message1 = 'logtest id ' . int(rand(9999));
|
||||||
|
my $message2 = 'logtest id ' . int(rand(9999));
|
||||||
|
|
||||||
|
$dispatcher->log( level => 'info', message => $message1 );
|
||||||
|
close $Rolling->{fh}; # disturb internal bookkeeping, must recover from this
|
||||||
|
$dispatcher->log( level => 'info', message => $message2 );
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################5
|
||||||
|
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################6
|
||||||
|
|
||||||
|
my @logfiles = glob('logfile*.txt');
|
||||||
|
|
||||||
|
ok(scalar(@logfiles) == 1 or scalar(@logfiles) == 2);
|
||||||
|
|
||||||
|
#########################7
|
||||||
|
|
||||||
|
my $content = '';
|
||||||
|
|
||||||
|
foreach my $file (@logfiles) {
|
||||||
|
open F, '<', $file;
|
||||||
|
local $/ = undef;
|
||||||
|
$content .= <F>;
|
||||||
|
close F;
|
||||||
|
unlink $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok($content =~ /$message1/);
|
||||||
|
ok($content =~ /$message2/);
|
||||||
|
|
||||||
|
#########################8
|
5
t/7testpod.t
Executable file
5
t/7testpod.t
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
use Test::More;
|
||||||
|
eval "
|
||||||
|
use Test::Pod 1.00;";
|
||||||
|
plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
|
||||||
|
all_pod_files_ok();
|
5
t/8coverage.t
Executable file
5
t/8coverage.t
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
use Test::More;
|
||||||
|
eval "
|
||||||
|
use Test::Pod::Coverage 1.00; ";
|
||||||
|
plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage" if $@;
|
||||||
|
all_pod_coverage_ok();
|
75
t/9reopenfh.t
Executable file
75
t/9reopenfh.t
Executable file
@ -0,0 +1,75 @@
|
|||||||
|
# Before `make install' is performed this script should be runnable with
|
||||||
|
# `make test'. After `make install' it should work as `perl 1.t'
|
||||||
|
|
||||||
|
#########################
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
eval "
|
||||||
|
use Test::Fork; ";
|
||||||
|
plan skip_all => "Test::Fork required for this test" if $@;
|
||||||
|
plan tests => 12;
|
||||||
|
|
||||||
|
use Log::Dispatch;
|
||||||
|
use Log::Dispatch::File::Rolling;
|
||||||
|
ok(1); # If we made it this far, we're ok.
|
||||||
|
|
||||||
|
#########################1
|
||||||
|
|
||||||
|
my $dispatcher = Log::Dispatch->new;
|
||||||
|
ok($dispatcher);
|
||||||
|
|
||||||
|
#########################2
|
||||||
|
|
||||||
|
my %params = (
|
||||||
|
name => 'file',
|
||||||
|
min_level => 'debug',
|
||||||
|
filename => 'logfile.txt',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $Rolling = Log::Dispatch::File::Rolling->new(%params);
|
||||||
|
ok($Rolling);
|
||||||
|
|
||||||
|
#########################3
|
||||||
|
|
||||||
|
$dispatcher->add($Rolling);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################4
|
||||||
|
|
||||||
|
my @message = map {'logtest id ' . int(rand(9999))} 1 .. 3;
|
||||||
|
|
||||||
|
my $initial_fileno = fileno $Rolling->{fh};
|
||||||
|
$dispatcher->log( level => 'info', message => $message[0] );
|
||||||
|
my $parent_fileno = fileno $Rolling->{fh};
|
||||||
|
is( $parent_fileno, $initial_fileno, "initial log call doesn't reopen" );
|
||||||
|
fork_ok( 2, sub {
|
||||||
|
$dispatcher->log( level => 'info', message => $message[1] );
|
||||||
|
my $child_fileno = fileno $Rolling->{fh};
|
||||||
|
isnt( $child_fileno, $parent_fileno, "logging in child reopens" );
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
ok(1);
|
||||||
|
});
|
||||||
|
$dispatcher->log( level => 'info', message => $message[2] );
|
||||||
|
my $_parent_fileno = fileno $Rolling->{fh};
|
||||||
|
is( $_parent_fileno, $parent_fileno, "logging in parent does not reopen" );
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################5
|
||||||
|
|
||||||
|
$dispatcher = $Rolling = undef;
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
|
||||||
|
#########################6
|
||||||
|
|
||||||
|
my @logfiles = glob('logfile*.txt');
|
||||||
|
|
||||||
|
ok(scalar(@logfiles) == 1 or scalar(@logfiles) == 2);
|
||||||
|
|
||||||
|
#########################7
|
||||||
|
|
||||||
|
foreach my $file (@logfiles) {
|
||||||
|
unlink $file;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user