RRD-Daemon
view release on metacpan or search on metacpan
lib/RRD/Daemon/Util.pm view on Meta::CPAN
package RRD::Daemon::Util;
use strict;
use warnings;
use feature qw( :5.10 );
=head1 NAME
RRD::Daemon::Util - utilities for RRD::Daemon
=cut
use base qw( Exporter );
our @EXPORT_OK = qw( ff fdur ftime
debug error fatal trace info lwrite warn warning
ddump ddumps ddumpc ddumpcs
tdump tdumps tdumpc tdumpcs
DUMP_SINGLE_LINE DUMP_MULTI_LINE
FTIME_INC_EPOCH FTIME_SHORT
init_log4perl mlhash
);
use Carp qw( cluck );
use File::Spec::Functions qw( rel2abs );
use FindBin qw( $Script );
use IO::All qw( io );
use Log::Log4perl qw( :levels get_logger ); # grr, cannot import levels individually even from ::Level
use Params::Validate qw( validate_pos
HASHREF SCALAR SCALARREF );
use POSIX qw( strftime );
# ----------------------------------------------------------------------------
use constant DUMP_SINGLE_LINE => \1; # value is == only to itself - not even == another \1
use constant DUMP_MULTI_LINE => \2; # value is == only to itself
use constant FTIME_INC_EPOCH => 1;
use constant FTIME_SHORT => 2;
BEGIN {
Log::Log4perl::Layout::PatternLayout::add_global_cspec
('D', sub { strftime '%s %a %F %I:%M:%S %p GMT', gmtime });
}
use constant DEFAULT_LOGGING_CONF => <<'LOG4PERL';
log4perl.rootLogger=WARN, SCREEN, LOGFILE
log4perl.category.Placeholder.For.ScreenD.Appender=NONE, SCREEND, LOGFILED
log4perl.appender.SCREEN=Log::Log4perl::Appender::Screen
log4perl.appender.SCREEN.layout=PatternLayout::Multiline
log4perl.appender.SCREEN.layout.ConversionPattern=[%d{EEEdd}Z%d{HH:mm:ss}] %5p> %m%n
log4perl.appender.SCREEN.Threshold=INFO
log4perl.appender.LOGFILE=Log::Dispatch::FileRotate
log4perl.appender.LOGFILE.DatePattern=yyyy-MM-dd
log4perl.appender.LOGFILE.filename=sub { use FindBin '$Script'; join '/', ($ENV{join '_', $Script, 'LOGDIR'} // join('/', '/tmp', (getpwuid $<)[0], 'logs')), "$Script.log" }
log4perl.appender.LOGFILE.max=10
log4perl.appender.LOGFILE.mode=append
log4perl.appender.LOGFILE.TZ=UTC
log4perl.appender.LOGFILE.layout=PatternLayout::Multiline
log4perl.appender.LOGFILE.layout.ConversionPattern=[%D] %5p> %m%n
log4perl.appender.LOGFILE.Threshold=INFO
log4perl.appender.SCREEND=Log::Log4perl::Appender::Screen
log4perl.appender.SCREEND.layout=PatternLayout::Multiline
log4perl.appender.SCREEND.layout.ConversionPattern=[%d{EEEdd}Z%d{hh:mm:ss}] %5p> %M(%L) - %m%n
# log4perl.appender.SCREEND.Threshold=NONE
log4perl.appender.LOGFILED=Log::Dispatch::FileRotate
log4perl.appender.LOGFILED.DatePattern=yyyy-MM-dd
log4perl.appender.LOGFILED.filename=sub { use FindBin '$Script'; join '/', ($ENV{join '_', $Script, 'LOGDIR'} // join('/', '/tmp', (getpwuid $<)[0], 'logs')), "$Script.log" }
log4perl.appender.LOGFILED.max=10
log4perl.appender.LOGFILED.mode=append
log4perl.appender.LOGFILED.TZ=UTC
log4perl.appender.LOGFILED.layout=PatternLayout::Multiline
log4perl.appender.LOGFILED.layout.ConversionPattern=[%D] %5p> %M(%L) - %m%n
LOG4PERL
# ----------------------------------------------------------------------------
sub ff (@) {
my @args = @_;
cluck sprintf "%s called with no args\n", (caller 0)[3]
if 0 == @args;
cluck sprintf "undef passed to %s >>%s<<\n",
(caller 0)[3],
Data::Dumper->new(\@_)->Maxdepth(3)->Indent(0)->Terse(1)->Dump
if grep !defined, @args;
my $text;
if ( 1 == @args ) {
if ( UNIVERSAL::isa($args[0], 'HASH') ) {
my $dd = Data::Dumper->new(\@args);
$text = $dd->Maxdepth(3)->Indent(wantarray ? 1 : 0)->Terse(1)->Dump;
} elsif ( UNIVERSAL::isa($args[0], 'ARRAY') ) {
my $dd = Data::Dumper->new(\@args);
$text = $dd->Maxdepth(3)->Indent(wantarray ? 1 : 0)->Terse(1)->Dump;
} else {
$text = $args[0];
}
} else {
if ( DUMP_SINGLE_LINE eq $args[0] or DUMP_MULTI_LINE eq $args[0]) {
if ( 'ARRAY' eq ref $args[1] or 2 < @args ) {
my @a = 2 == @args ? @{$args[1]} : @args[1..$#args];
$text = join DUMP_SINGLE_LINE eq $args[0] ? ' ' : "\n",
map Data::Dumper->new([$a[$_*2+1]],[$a[$_*2]])->Maxdepth(3)->Indent(0)->Terse(0)->Dump,
0..$#a/2;
} elsif ( 'HASH' eq ref $args[1] ) {
$text = join DUMP_SINGLE_LINE eq $args[0] ? ' ' : "\n",
map Data::Dumper->new([$args[1]->{$_}],[$_])->Maxdepth(3)->Indent(0)->Terse(0)->Dump,
sort keys %{$args[1]};
} else {
$text = join DUMP_SINGLE_LINE eq $args[0] ? ' ' : "\n",
Data::Dumper->new([@args[1..$#args]])->Maxdepth(3)->Indent(DUMP_MULTI_LINE eq $args[0])->Terse(1)->Dump;
}
} else {
# beware sprintf's prototype of ($@), which means that sprintf @args
# would place the first arg in a scalar context - so taking a single arg
# being the size of the list
$text = sprintf $args[0], @args[1..$#args];
}
}
return wantarray ? split(/\n/, $text) : $text
}
# -------------------------------------
sub _lwrite ($$@) {
my ($methname, $level, @msg) = @_;
( run in 2.733 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )