use warnings; use strict; package Library::Foo; { my $log; sub new { my ($class, $logger) = @_; my $self = bless {}, $class; # set the class level log $log = $logger->child('Library::Foo'); # generate a local log per each sub my $log = $log->child('new'); $log->_0("creating new foo obj"); return $self; } } package Library; { use Logging::Simple; # set the class log my $log = Logging::Simple->new(name => 'Library'); sub new { my $self = bless {}, shift; # generate a child log per sub my $log = $log->child('new'); $log->_0('creating Library obj'); return $self; } sub log { # return the class level log obj return $log; } sub foo { my ($self) = @_; my $log = $log->child('foo'); $log->_0('about to crate lib::foo obj'); $self->{foo} = Library::Foo->new($self->log); } } package main; my $lib = Library->new; $lib->foo;