Leser: 16
QuoteCan't locate object method "open" via package "EBL::ebl_reporting" (perhaps you forgot to load "EBL::ebl_reporting"?) at DWG2AIMS.pl line 66.
Drücken Sie eine beliebige Taste . . .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use Win32::Service; use 5.010; use POSIX; use EBL::ebl_monitoring; # Sonderfunktionen für EBL-Einsatz use EBL::ebl_reporting; # Reportingfunktion use File::Copy qw(copy); # main-parameters my %config=( "logstatus"=>1, # soll Protokoll geschrieben werden "shellstatus"=>1, # zusätzliche Protokollausgabe Shell "active"=>0, # damit wird die Funktion (Kopiervorgang und Server stop / start scharf geschaltet) "logfilename"=>'DWG2AIMS.log', # Dateiname für die Scriptausführung "folder_source"=>'', # Quelle der DWG-Dateien ); # Reportsteuerung my $log=EBL::ebl_reporting->open($config{logfile_name}); $log->log($config{logstatus}); $log->shell($config{shellstatus});
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
package ebl::reporting; use strict; use warnings; use IO::File; #use Time::localtime; require Time::localtime; sub open { my $class=shift; my $log_file=shift; # Referenz auf STDOUT my $fh=\*STDOUT; # wenn object und kein File => neuer Name = alter Name if(ref $class && !$log_file) { $log_file=$class->{file}; $class->{fh}->close(); } # versuchen Fh zu öffnen if($log_file) { my $ofh=IO::File->new(); my $mode='>'; $mode='>>' if( ref $class ); if($ofh->open($log_file,$mode) ) { $fh=$ofh; } else { $fh->print("ERROR open $log_file ($!)\nwrite to STDOUT\n"); } } # objektwerte neu setzen wenn objekt if( ref $class ) { $class->{fh}=$fh; $class->{file}=$log_file; return $class; } # neues Objekt return bless({ fh=>$fh, file=>$log_file, on=>1 },$class); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
package EBL::ebl_reporting; use strict; use warnings; use IO::File; #use Time::localtime; require Time::localtime; sub open { my $class=shift; my $log_file=shift; # Referenz auf STDOUT my $fh=\*STDOUT; # wenn object und kein File => neuer Name = alter Name if(ref $class && !$log_file) { $log_file=$class->{file}; $class->{fh}->close(); } # versuchen Fh zu öffnen if($log_file) { my $ofh=IO::File->new(); my $mode='>'; $mode='>>' if( ref $class ); if($ofh->open($log_file,$mode) ) { $fh=$ofh; } else { $fh->print("ERROR open $log_file ($!)\nwrite to STDOUT\n"); } } # objektwerte neu setzen wenn objekt if( ref $class ) { $class->{fh}=$fh; $class->{file}=$log_file; return $class; } # neues Objekt return bless({ fh=>$fh, file=>$log_file, on=>1 },$class); } # log(1) => logging an # log(0) => logging aus # log() => aktueller Status sub log { my $self=shift; $self->{on}=shift() if(@_); return $self->{on}; } # shell(1) => zusätzliche Shell-Ausgabe an # shell(0) => zusätzliche Shell-Ausgabe aus # shell() => aktueller Status sub shell { my $self=shift; $self->{on}=shift() if(@_); return $self->{on}; } # filename sub file { shift->{file}; } # filehandle sub fh { shift->{fh}; } # write to file mit optionaler Ausgabe auf die Shell sub write { $_[0]->fh->print($_[1]."\n") if($_[0]->log()); print($_[1]."\n") if($_[0]->shell()); } # write to file and screen sub doublewrite { $_[0]->fh->print($_[1]."\n") if($_[0]->log()); print($_[1]."\n") } # close filehandle sub close { shift->fh->close(); } # wahr wenn Datei geöffnet sub opened { shift->fh->opened(); } 1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
... use EBL::ebl_monitoring; # Sonderfunktionen für EBL-Einsatz use EBL::ebl_reporting; # Reportingfunktion use File::Copy qw(copy); # main-parameters my %config=( "logstatus"=>1, # soll Protokoll geschrieben werden "shellstatus"=>1, # zusätzliche Protokollausgabe Shell "active"=>0, # damit wird die Funktion (Kopiervorgang und Server stop / start scharf geschaltet) "logfilename"=>'DWG2AIMS.log', # Dateiname für die Scriptausführung "folder_source"=>'', # Quelle der DWG-Dateien ); # Reportsteuerung my $log=EBL::ebl_reporting->open($config{logfile_name}); $log->log($config{logstatus}); $log->shell($config{shellstatus}); $log->write("Starten eines MapEdit-Update (AIMS-Server)"); ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
package Jan99; sub new { bless({ on=>1 }, shift) } sub log { my $self=shift; $self->{on}=shift if @_; return $self->{on}; } sub shell { my $self=shift; $self->{on}=shift if @_; return $self->{on}; } package Besser; sub new { bless({ log_on => 1, shell_on => 1 }, shift) } sub log { my $self=shift; $self->{log_on}=shift if @_; return $self->{log_on}; } sub shell { my $self=shift; $self->{shell_on}=shift if @_; return $self->{shell_on}; } package main; use 5.14.0; sub show { my $t = shift; say "Log: ", $t->log(), ", Shell: ", $t->shell(); } sub test { my $t = shift; say "Original: "; show($t); say "Setting log(0)"; $t->log(0); show $t; say "Setting shell(1)"; $t->shell(1); show $t; say "Setting log(1)"; $t->log(1); show $t; } say "Testing Jan99"; test(Jan99->new()); say "Testing Besser"; test(Besser->new());
1 2 3 4
sub show_status { my $self=shift; print "Log: ", $self->log(), ", Shell: ", $self->shell()."\n"; }
1 2 3 4 5
sub write { $_[0]->show_status(); $_[0]->fh->print($_[1]."\n") if($_[0]->log()); print($_[1]."\n") if($_[0]->shell()); }
1 2 3 4 5
# Reportsteuerung my $log=EBL::ebl_reporting->new(); $log=EBL::ebl_reporting->open($config{logfile_name}); $log->log($config{logstatus}); $log->shell($config{shellstatus});
1 2 3 4 5 6 7
# write to file mit optionaler Ausgabe auf die Shell sub write { print "write-debug: ".$_[0]->log()."\n"; $_[0]->show_status(); $_[0]->fh->print($_[1]."\n") if($_[0]->log()); print($_[1]."\n") if($_[0]->shell()); }
Quotewrite-debug: 1
Log: 1, Shell: 1
$fh->print("ERROR open $log_file ($!)\nwrite to STDOUT\n");
1 2 3 4 5
sub write { my ($self, $msg) = @_; $self->fh->print($msg."\n") if $self->log(); print($msg."\n") if $self->shell(); }
QuoteIIRC war die ursprüngliche Aufgabenstellung so, dass da OOP keinen Nutzen brachte und man nur ein traditionelles Package brauchte um ein paar Funktionen zu bündeln und den Scope einiger statischer Variablen zu sinnvoll zu begrenzen.
Quote.. wo Du zwei unterschiedliche EBL::ebl_reporting-Logger-Objekte parallel brauchst - nur dann bringt der OO-Ansatz ..
QuoteDein open() ist schlimmster Spaghetti-Code ...
Quote...Eine andere Grausamkeit: Dass Du in write() und doublewrite() ...
2015-04-01T06:59:35 jan99Aber irgendwie komme ich im Moment dennoch nicht weiter....
Vielleicht erbarmt sich nochmal einer uns kann mir zeigen wie es richtig aussehen muss. Wenn ich jetzt selber "umprokel" dann vermutlich an den falschen Stellen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
# Funktionen für das Loggen von Programmen # Jan Tappenbeck, 2015 # # # Historie # 2015-03-27 von Privat übernommen package EBL::ebl_reporting; use strict; use warnings; use IO::File; #use Time::localtime; require Time::localtime; use 5.14.0; sub new { bless({ log_on => 1, shell_on => 1 }, shift) } sub show_status { my $self=shift; print "Log: ", $self->log(), ", Shell: ", $self->shell()."\n"; } sub open { my $class=shift; my $log_file=shift; # Referenz auf STDOUT my $fh=\*STDOUT; # wenn object und kein File => neuer Name = alter Name if(ref $class && !$log_file) { $log_file=$class->{file}; $class->{fh}->close(); } # versuchen Fh zu öffnen if($log_file) { my $ofh=IO::File->new(); my $mode='>'; $mode='>>' if( ref $class ); if($ofh->open($log_file,$mode) ) { $fh=$ofh; } else { $fh->print("ERROR open $log_file ($!)\nwrite to STDOUT\n"); } } # objektwerte neu setzen wenn objekt if( ref $class ) { $class->{fh}=$fh; $class->{file}=$log_file; return $class; } # neues Objekt return bless({ fh=>$fh, file=>$log_file, on=>1 },$class); } # log(1) => logging an # log(0) => logging aus # log() => aktueller Status sub log { my $self=shift; $self->{log_on}=shift() if(@_); return $self->{log_on}; } # shell(1) => zusätzliche Shell-Ausgabe an # shell(0) => zusätzliche Shell-Ausgabe aus # shell() => aktueller Status sub shell { my $self=shift; $self->{shell_on}=shift() if(@_); return $self->{shell_on}; } # filename sub file { shift->{file}; } # filehandle sub fh { shift->{fh}; } # write to file mit optionaler Ausgabe auf die Shell sub write { my ($self, $msg) = @_; $self->fh->print($msg."\n") if $self->log(); print($msg."\n") if $self->shell(); }#end-write # close filehandle sub close { shift->fh->close(); } # wahr wenn Datei geöffnet sub opened { shift->fh->opened(); } 1;
1 2 3
package main; my $rep = EBL::ebl_reporting->new()->open("/tmp/jan99.txt"); $rep->write("Hallo Jan");
1
2
3
4
5
6
7
8
9
10
% perl jan99.pl
Hallo Jan
% cat jan99.txt
Hallo Jan
% perl jan99.pl
Hallo Jan
% cat jan99.txt
Hallo Jan
Hallo Jan
%
1 2 3 4 5
# wenn kein Log-Filename definiert ... Meldung if(length($log_file)==0 && !$log_file) { $fh->print("ERROR - no logfilename define!\nwrite to STDOUT\n"); }