our
$VERSION
=
'0.08'
;
BEGIN { Log::Dispatch::Config->
use
or
warn
"$@\nIt moves without using Log::Dispatch::Config.\n"
; }
sub
setup {
my
$c
=
shift
;
my
$old_log
=
undef
;
if
(
$c
->
log
and
ref
(
$c
->
log
) eq
'Catalyst::Log'
) {
$old_log
=
$c
->
log
;
}
$c
->
log
( Catalyst::Plugin::Log::Dispatch::Backend->new );
unless
(
ref
(
$c
->config->{
'Log::Dispatch'
} ) eq
'ARRAY'
) {
push
(
@{
$c
->config->{
'Log::Dispatch'
} },
{
class
=>
'STDOUT'
,
name
=>
'default'
,
min_level
=>
'debug'
,
format
=>
'[%p] %m%n'
}
);
}
foreach
my
$tlogc
( @{
$c
->config->{
'Log::Dispatch'
} } ) {
my
%logc
= %{
$tlogc
};
if
(
$logc
{
'class'
} eq
'STDOUT'
or
$logc
{
'class'
} eq
'STDERR'
) {
my
$io
= IO::Handle->new;
$io
->fdopen(
fileno
(
$logc
{
'class'
} ),
'w'
);
$logc
{
'class'
} =
'Handle'
;
$logc
{
'handle'
} =
$io
;
}
my
$class
=
sprintf
(
"Log::Dispatch::%s"
,
$logc
{
'class'
} );
delete
$logc
{
'class'
};
$logc
{
'callbacks'
} = [
$logc
{
'callbacks'
}]
if
(
ref
(
$logc
{
'callbacks'
}) eq
'CODE'
);
if
(
exists
$logc
{
'format'
} and
defined
$Log::Dispatch::Config::CallerDepth
) {
my
$callbacks
= Log::Dispatch::Config->format_to_cb(
$logc
{
'format'
},0);
if
(
defined
$callbacks
) {
$logc
{
'callbacks'
} = []
unless
(
$logc
{
'callbacks'
});
push
(@{
$logc
{
'callbacks'
}},
$callbacks
);
}
}
elsif
(!
$logc
{
'callbacks'
}) {
$logc
{
'callbacks'
} =
sub
{
my
%p
=
@_
;
return
"$p{message}\n"
; };
}
$c
->
log
->add(
$class
->new(
%logc
) );
}
if
(
$old_log
&&
defined
$old_log
->body) {
my
@old_logs
;
foreach
my
$line
(
split
/\n/,
$old_log
->body ) {
if
(
$line
=~ /^\[(\w+)] (.+)$/ ) {
push
(
@old_logs
, {
level
=> $1,
msg
=> [$2] } );
}
elsif
(
$line
=~ /^\[(\w{3} \w{3}[ ]{1,2}\d{1,2}[ ]{1,2}\d{1,2}:\d{2}:\d{2} \d{4})\] \[catalyst\] \[(\w+)\] (.+)$/ ) {
push
(
@old_logs
, {
level
=> $2,
msg
=> [$3] } );
}
else
{
push
( @{
$old_logs
[-1]->{
'msg'
} },
$line
);
}
}
foreach
my
$line
(
@old_logs
) {
my
$level
=
$line
->{
'level'
};
$c
->
log
->
$level
(
join
(
"\n"
, @{
$line
->{
'msg'
} } ) );
}
}
$c
->NEXT::setup(
@_
);
}
1;
{
foreach
my
$l
(
qw/debug info warn error fatal/
) {
my
$name
=
$l
;
$name
=
'warning'
if
(
$name
eq
'warn'
);
$name
=
'critical'
if
(
$name
eq
'fatal'
);
no
strict
'refs'
;
*{
"is_${l}"
} =
sub
{
my
$self
=
shift
;
return
$self
->level_is_valid(
$name
);
};
*{
"$l"
} =
sub
{
my
$self
=
shift
;
my
%p
= (
level
=>
$name
,
message
=>
"@_"
);
local
$Log::Dispatch::Config::CallerDepth
= 1;
foreach
(
keys
%{
$self
->{outputs} }) {
my
%h
=
%p
;
$h
{name} =
$_
;
$h
{message} =
$self
->{outputs}{
$_
}->_apply_callbacks(
%h
)
if
(
$self
->{outputs}{
$_
}->{callbacks});
push
(@{
$self
->_body}, \
%h
);
}
};
}
}
sub
new {
my
$pkg
=
shift
;
my
$this
=
$pkg
->SUPER::new(
@_
);
$this
->mk_accessors(
qw/abort _body/
);
$this
->_body([]);
return
$this
;
}
sub
dumper {
my
$self
=
shift
;
return
$self
->debug( Data::Dumper::Dumper(
@_
) );
}
sub
_dump {
my
$self
=
shift
;
return
$self
->debug( Data::Dump::
dump
(
@_
) );
}
sub
level_is_valid {
my
$self
=
shift
;
return
0
if
(
$self
->abort );
return
$self
->SUPER::level_is_valid(
@_
);
}
sub
_flush {
my
$self
=
shift
;
if
(
$self
->abort || !(
scalar
@{
$self
->_body})) {
$self
->abort(
undef
);
}
else
{
foreach
my
$p
(@{
$self
->_body}) {
$self
->{outputs}{
$p
->{name}}->log_message(%{
$p
});
}
}
$self
->_body([]);
}
1;