Hallo Zusammen,
also ich hab es mir nochmal angeschaut & der Wert für das richtige Modul muss 4 sein, also caller( $Caller + 4 );
Allerdings gibt es da wieder Probleme :
Ich habe eine Datei namens InterfaceInstaller, die folgende new() - Subroutine enthält :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub new {
my ( $Type, %Parameter ) = @_;
my $Self = { };
bless( $Self , $Type );
$Self -> { Debug } = $Parameter{ Debug } || 0;
if( $Self -> { Debug } == 1 )
{
$Kernel::OM -> Get( 'Kernel::System::Low' ) -> Ausfuehrung( Priority => 'notice' ,
Message => "Test" );
}
my $Zusaetzliches_Loader = $Kernel::OM -> Get( 'Kernel::Modules::Mist' );
return $Self;
}
Das "Get( 'Kernel::System::Lo' )" erzeugt den Fehler, da das Modul nicht exisitiert.
Dies ist der Aufruf der Subroutine "Log( )" in der Datei Log.pm :
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
sub Log {
my ( $Self, %Parameter ) = @_;
# Festlegung der Prio des Aufrufs
my $Priority = lc $Parameter{ Priority } || 'debug';
my $Caller = $Parameter{ Caller } || 0;
# Speicherung der Fehler - Details für das Debugging ( Aufruf , Datei , Zeile , Sub - Routine )
my ( $Package1 , $Filename1 , $Line1 , $Subroutine1 ) = caller( $Caller + 0 );
my ( $Package2 , $Filename2 , $Line2 , $Subroutine2 ) = caller( $Caller + 1 );
$Subroutine2 ||= $0;
# Log Backend
$Self -> { Backend } -> Log( Priority => $Priority ,
Message => $Message ,
LogPrefix => $Self -> { LogPrefix } ,
Module => $Subroutine2 ,
Line => $Line1 ,
);
# Nur im Fehler - Fall ( Log - Level : Error )
if ( $Priority =~ /^error/i )
{
my $Error = sprintf "ERROR : $Self->{LogPrefix} PERL : %vd OS : $^O Time : " . localtime( ) . "\n\n", $^V;
$Error .= "Fehler - Meldung : $Message";
# DEBUG
# $Error .= " Traceback ( $$ ) : \n";
COUNT:
for ( my $Count = 0; $Count < 30; $Count++ ) {
my ( $Package1, $Filename1, $Line1, $Subroutine1 ) = caller( $Caller + $Count );
last COUNT if !$Line1;
my ( $Package2, $Filename2, $Line2, $Subroutine2 ) = caller( $Caller + 1 + $Count );
$Subroutine2 ||= $0;
my $VersionString = '';
eval { $VersionString = $Package1 -> VERSION || ''; };
if ( $VersionString )
{
$VersionString = ' ( v' . $VersionString . ' )';
}
# DEBUG
# $Error .= " Module : $Subroutine2$VersionString Line : $Line1\n";
last COUNT if !$Line2;
}
}
Wie bereits im letzten Post angesprochen, übergebe ich alle Details des Fehlers über diese Funktion :
my ( $Package1 , $Filename1 , $Line1 , $Subroutine1 ) = caller( $Caller + 0 );
my ( $Package2 , $Filename2 , $Line2 , $Subroutine2 ) = caller( $Caller + 1 );
Ändere ich es folgendenmaßen :
my ( $Package2 , $Filename2 , $Line2 , $Subroutine2 ) = caller( $Caller + 4 );
erhalte ich die richtige Sub-Routine bei der Ausgabe, "InterfaceInstaller::new",
für das fehlerhafte Modul 'Kernel::System::Low'.
Fehler - Details :
Stufe : error
Meldung : Fehler bei der Initialisierung des Moduls Kernel::System::Lo
Identifier : ?LogPrefix?-10
Sub - Routine : Kernel::System::InterfaceInstaller::new
Zeile : 227
Wenn man darüber nachdenkt, logisch. Vor dem InterfaceInstaller steht noch das Script Installer,
daher ist die Reihenfolge ( meiner Meinung nach )
Installer => 5
InterfaceInstaller => 4
ObjectManager => 3
_DieWithError => 2
Log => 1
SysLog => 0
Setze ich "$Caller + 4" ist die Fehlerausgabe für 'Kernel::System::Log' ( richtiges Modul ) zwar richtig, aber nachfolgend wird das
der Aufruf nicht richtig verarbeitet :
Prio : notice
Prio - Num : 8
Message : Test
Caller : 0
Modul : Kernel::System::InterfaceInstaller | Datei : C:\Scripts\Aktuell/Kernel/System/InterfaceInstaller.pm | Zeile : 27 | Sub - Routine : Kernel::System::Log::Log
Use of uninitialized value $Package2 in concatenation (.) or string at C:\Scripts\Aktuell/Kernel/System/Log.pm line 99.
Use of uninitialized value $Filename2 in concatenation (.) or string at C:\Scripts\Aktuell/Kernel/System/Log.pm line 99.
Use of uninitialized value $Line2 in concatenation (.) or string at C:\Scripts\Aktuell/Kernel/System/Log.pm line 99.
Use of uninitialized value $Subroutine2 in concatenation (.) or string at C:\Scripts\Aktuell/Kernel/System/Log.pm line 99.
Modul : | Datei : | Zeile : | Sub - Routine :
Aber ich brauche den Caller +4 Aufruf ja damit in der Fehlererkennung das richtige Modul angezeigt wird.
Es ist ja einfach nur ein Logaufruf.
Und da da Script hier :
for ( my $Count = 0; $Count < 30; $Count++ ) {
my ( $Package1, $Filename1, $Line1, $Subroutine1 ) = caller( $Caller + $Count );
es auch noch verwendet, dachte ich, vielleicht muss ich hier noch einen Automatismus einbauen,
der die "Ebene" erkennt, auf der der Aufruf passiert. ???
VG
YAPD
Last edited: 2019-06-01 22:24:12 +0200 (CEST)
Yet Another Perl Developer