Thread Wie Log-Verarbeitung ohne Abbruch bewerkstelligen (12 answers)
Opened by YAPD at 2019-05-31 19:09

YAPD
 2019-06-01 22:23
#190077 #190077
User since
2015-09-20
146 Artikel
BenutzerIn

user image
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 :

Code: (dl )
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 :
Code: (dl )
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 :

Code: (dl )
1
2
my ( $Package1 , $Filename1 , $Line1 , $Subroutine1 ) = caller( $Caller + 0 );											
my ( $Package2 , $Filename2 , $Line2 , $Subroutine2 ) = caller( $Caller + 1 );


Ändere ich es folgendenmaßen :

Code: (dl )
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'.

Code: (dl )
1
2
3
4
5
6
7
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 :

Code: (dl )
1
2
3
4
5
6
7
8
9
10
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 :

Code: (dl )
1
2
3
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

View full thread Wie Log-Verarbeitung ohne Abbruch bewerkstelligen