So I want a logger object, and only one logger object thought it may be used in various packages. I follow the simple instructions at https://www.perl.com/article/52/2013/12/11/Implementing-the-singleton-pattern-in-Perl but when I test it I see I get two objects. In the following test one gets its 'Log' value altered and the other does not ...
The test ...
perl -MData::Dumper -Mlib=. -MHelper::Lgr -E' \
$l=Helper::Lgr->getInstance();$l->log(0,"Log1"); \
$z=Helper::Lgr->getInstance();$l->set('Log', 4); \
print Dumper $l; \
print Dumper $z'
Get instance called from main
Not yet instantiated
Sun Dec 29 18:51:08 2019 Log1
Get instance called from main
Not yet instantiated
$VAR1 = bless( {
'LogName' => 'CommandLine.log',
'_continuation' => 0,
'Screen' => 0,
'LogDir' => '/home/random/log',
'fh' => \*Helper::Lgr::__ANONIO__,
'Log' => 4
}, 'Helper::Lgr' );
$VAR1 = bless( {
'LogDir' => '/home/random/log',
'Screen' => 0,
'LogName' => 'CommandLine.log',
'_continuation' => 0,
'Log' => 0,
'fh' => \*Helper::Lgr::__ANONIO__
}, 'Helper::Lgr' );
Here is the start of the Logger pm that I am using, the set method is pretty much what you expect,so not reprduced here ...
#!/usr/bin/perl
#
# Lgr.pm
#
# Controls both logging to a file and to the screen
# you can set a verbosity for each independently
#
package Helper::Lgr;
use strict;
use warnings;
use v5.10.0;
use File::Basename;
use File::Path qw(make_path);
use FindBin;
use Data::Dumper;
my $script = basename( $0, '.pl', '.pm' );
# Logger is a classic singleton pattern. We only want one instance in
+our code
my $instance = undef;
sub getInstance {
say "Get instance called from ".( caller );
if ($instance) { # Already instantiated, check if we need to chang
+e any settings
say "Already instantiated";
return $instance;
}
else {
say "Not yet instantiated";
}
my $class = shift;
my $instance = shift; # settings to use
$instance = {} unless $instance;
die "$instance is not a hash ref\n" unless ref $instance eq 'HASH'
+;
bless $instance, $class; # we bless early so we can call methods o
+n ourself
... And much more ...
What simple fact am I missing that I get a fresh logger each time?
Cheers,
R.
Pereant, qui ante nos nostra dixerunt!
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.