|
|
Warnungen des Programms überwachen und ins error.log des Apache schreiben
[thread]14596[/thread]
hide all
open all
-

+55 replies
-
User since 2009-09-13
1192
articles
|
Habe folgenden Ablauf:
- Hauptprogramm required ein anderes script und ruft darin eine sub auf
- sub erzeugt einen typischen Fehler Use of uninitialized value
- Hauptprogramm schaut, ob !-z error.log; Bedingung ist false
Kann es sein, dass der Webserver das error.log erst schreibt/schließt, wenn das Hauptprogramm beendet ist?
Gibt es eine Möglichkeit, wie das Hauptprogramm sofort nach Ausführung der sub im required Script erkennt, ob da was ins error.log kommen wird?
danke
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+6 replies
-
User since 2003-08-04
12999
articles
|
Normalerweise wird das gleich in das error.log geschrieben. Lässt sich gut mit "tail -f error.log" beobachten.
Zeig mal etwas Code...
|
|
|
|
|
|
-

+5 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T13:15:04
reneeZeig mal etwas Code...
test1.pl:
| Code (perl): |
|
$| = 1;
use strict;
use warnings;
my $error_vorher = (!-z '/home/meinpfad/logs/error.log' ? 'EINTRAG' : 'leer');
require 'test2.pl';
&fehlersub ('foo');
my $error_nachher = (!-z '/home/meinpfad/logs/error.log' ? 'EINTRAG' : 'leer');
print "Content-Type: text/plain\n\nHallo!<br>vorher: $error_vorher<br>nachher: $error_nachher";
|
test2.pl:
| Code (perl): |
|
use strict;
use warnings;
sub fehlersub {
my $bar = shift;
my $foo;
$bar += $foo;
}
return 1;
|
Ergebnis beim ersten Aufruf:
| Code: |
|
Hallo! vorher: leer nachher: leer
|
Beim zweiten Aufruf erst:
| Code: |
|
Hallo! vorher: EINTRAG nachher: EINTRAG
|
Woran liegt das?
Ich hätte gern NACH Aufruf von &fehlersub bereits das !-z mit true beantwortet :)
Edit: Typo
Last edited: 2010-02-06 14:50:56 +01:00
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-
|
GwenDragon
|
2010-02-06 14:23 |
|
|
|
User since 2005-01-17
5498
articles
|
Ist die Ausgabepufferung auch ausgeschaltet? Oder ist STDERR in Perl nicht gepuffert? Natürlich ist der Fehlerkanal niemals gepuffert. *doh*
Last edited: 2010-02-06 14:26:22 +01:00
|
Packagebeilage:
Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!
Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.
Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter. Oder einfacher: Ich nix die Deutsch.
|
|
|
|
-

+11 replies
-
User since 2003-08-04
7295
articles
|
es gibt keine garantie, wann ein fehler genau im errorlog landet.
pack mal ein sleep vor das zweite -z, dann solltest du den unterschied sehen.
es handelt sich hier um zwei prozesse. nicht das script schreibt was ins errorlog, sondern der apache (oder welcher webserver auch immer).
daher überschneiden sich der aufruf des -z und das schreiben ins log. meist ist das script einfach schneller.
vermutlich ist das hier sowieso ein XY-problem. ich habe es noch nie gebraucht, in echtzeit auf das errorlog zugreifen zu müssen. wenn du es unbedingt brauchst, solltest du den signalhandler $SIG{__WARN__} manipulieren.
|
|
|
|
|
|
-

+10 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T16:02:52
pqes gibt keine garantie, wann ein fehler genau im errorlog landet.
pack mal ein sleep vor das zweite -z, dann solltest du den unterschied sehen.
Selbst ein sleep 5; ändert garnichts.
2010-02-06T16:02:52
pqwenn du es unbedingt brauchst, solltest du den signalhandler $SIG{__WARN__} manipulieren.
Wie genau geht man da vor?
EDIT: Auf Linux klappt es mit sleep! Nur unter XP lokal nicht.
Last edited: 2010-02-06 17:17:48 +01:00
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+9 replies
-
User since 2003-08-04
7295
articles
|
|
|
|
-

+8 replies
-
User since 2009-09-13
1192
articles
|
Wärst Du so nett und würdest das eingebaut in meinen Code einmal beispielhaft zeigen?
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+7 replies
-
User since 2003-08-04
7295
articles
|
ich versteh nicht, wo das problem liegt. da steht ja ein beispiel in der doku.
| Code (perl): |
|
{
local $SIG{__WARN__} = sub {
$got_warning = $_[0];
};
require ...;
}
|
|
|
|
|
|
|
-

+6 replies
-
User since 2009-09-13
1192
articles
|
Das ist mal richtig geil!
test1.pl sieht nun so aus:
| Code (perl): |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$| = 1;
use strict;
use warnings;
print "Content-Type: text/html\n\nHallo!<br><br>";
my @error;
local $SIG{__WARN__} = sub {
push @error,shift;
};
print "Vorher: @error<br>\n";
require 'test2.pl';
&fehlersub ('foo');
print "Nachher: @error<br>\n";
|
Und tatsächlich:
| Code: |
|
Hallo!
Vorher: Nachher: Use of uninitialized value in addition (+) at test2.pl line 6. Argument "foo" isn't numeric in addition (+) at test2.pl line 6.
|
Jetzt muss ich das zu revisionszwecken nur noch parallel ins error.log printen und fertig.
Super!
Danke Euch allen! *bussi*
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+5 replies
-
User since 2009-09-13
1192
articles
|
Hab es jetzt so gelöst:
| Code (perl): |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$| = 1;
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
my %env = (
chmod_dateien => 0666,
);
print "Content-Type: text/html\n\nHallo!<br><br>";
my @errorstack;
local $SIG{__WARN__} = sub {
(my $error = shift) =~ s/[\r\n]//g;
push @errorstack,$error;
sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien});
if ($! eq '') {
print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
close $errorlog;
}
};
print "Vorher: @errorstack<br>\n";
require 'test2.pl';
&fehlersub ('foo');
print "Nachher: @errorstack<br>\n";
|
Das schreibt den Fehler in die error.log und löst mein Problem.
Perfekt!
Nochmal Danke!
Edit an pq als Wunsch/Request: Jetzt wäre es schön, wenn man diesem Beitrag als Thread-Eröffner das Kennzeichen "Lösung" geben könnte und dadurch dieser Beitrag farblich oder sonstwie kenntlich gemacht würde. Wäre für jemanden, der die Frage liest und das gleiche Problem hat einfacher, sofort die Lösung zu finden.
Last edited: 2010-02-06 18:51:59 +01:00
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+3 replies
-
User since 2003-08-04
7295
articles
|
aus perldoc perlvar:
Quote $! If used numerically, yields the current value of the C "errno"
variable, or in other words, if a system or library call fails,
it sets this variable. This means that the value of $! is
meaningful only immediately after a failure
in einem erfolgsfall von deinem sysopen kannst du deshalb keine garantie haben, dass $! wirklich leer ist. immer in bedingung mit dem vorherigen funktionsaufruf benutzen. sysopen(...) or do { ... }
|
|
|
|
|
|
-

+2 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T18:01:10
pqin einem erfolgsfall von deinem sysopen kannst du deshalb keine garantie haben, dass $! wirklich leer ist. immer in bedingung mit dem vorherigen funktionsaufruf benutzen. sysopen(...) or do { ... }
Danke für den Hinweis!
Dann also besser so?
| Code (perl): |
|
my $openerr = '';
sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien}) or $openerr = $!;
if ($openerr eq '') {
print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
close $errorlog;
}
|
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-
User since 2003-08-04
12999
articles
|
Besser so:
| Code (perl): |
|
if ( sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien}) ) {
print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
close $errorlog;
}
|
|
|
|
|
|
|
-
|
GwenDragon
|
2010-02-06 19:42 |
|
|
|
User since 2005-01-17
5498
articles
|
/- Mod GwenDragon:
@bianca
Es wäre gut gewesen, solche Erweiterungen dort zu diskutieren wo sie hingehören.
Unter Requests.
Da hätten wir auch den Sinn einer solchen Markierung unter Profis, Semiprofis, Interessierten und Lernenden diskutieren können.
In einem Problemlösungsthread finde ist das nicht mehr dem eigentlichen Fragestellung des Threads zugehörig.
Bitte mische doch in deinem Beitrag nicht sowas außerhalb des Topics.
/
|
Packagebeilage:
Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!
Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.
Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter. Oder einfacher: Ich nix die Deutsch.
|
|
|
|
-

+21 replies
-
|
GwenDragon
|
2010-02-06 17:06 |
|
|
|
User since 2005-01-17
5498
articles
|
Ich empfehle dir entweder STDERR deiner Skripte umzuleiten in eine eigenen Fehlerdatei oder das Signal WARN selbst zu behandeln.
Weiß du wie das geht?
|
Packagebeilage:
Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!
Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.
Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter. Oder einfacher: Ich nix die Deutsch.
|
|
|
|
-

+3 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T16:06:26
GwenDragonWeiß du wie das geht?
Nein, wäre für Hilfe dankbar.
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+17 replies
-
-

+16 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T16:19:42
sid burnVon daher ist die Lösung generell zu schauen ob schon etwas ins "error.log" geschrieben wurde und ob ein Fehler vorhanden war einfach ein weg der von sich aus Fehlerbehaftet ist.
Und wie würdest Du das lösen?
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-

+15 replies
-
-

+14 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T16:30:38
sid burnIch weiß ja nicht was du genau tuen möchtest. Das heißt was du logisch tuen möchtest.
Es geht darum, im Rahmen der Entwicklung/des Codings Fehler sofort zu erkennen.
Das mache ich derzeit, indem ich im Programm nach Aufruf der sub auf !-z error.log prüfe und im Falle von true den entspr. Menüpunkt einfärbe. Das hätte ich halt gern schon sofort gewußt und nicht erst beim zweiten Aufruf des Hauptprogramms. Wäre einfach eleganter.
Kriegsentscheidend und produktiv ist das alles nicht, denn die Fehler finde ich im Rahmen der Entwicklung natürlich trotzdem. Hatte mir halt nur nicht vorgestellt, dass es so kompliziert ist, es sofort zu bekommen, wollte es mir nur angenehmer machen.
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-
User since 2003-08-04
7295
articles
|
wie schon gesagt wurde, ein tail -f auf das errorlog sollte in diesem fall ausreichend sein. ohne blick auf das errog arbeitet man ja blind.
edit:
und um das rad nicht neu zu erfinden:
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
edit pq: teilbaum ausgelagert
Last edited: 2010-03-07 02:32:36 +01:00
|
|
|
|
|
|
-
-

+3 replies
-
|
GwenDragon
|
2010-02-06 19:10 |
|
|
|
User since 2005-01-17
5498
articles
|
/- Mod GwenDragon:
Ich habe mal den Titel geändert, dass auch Suchende durch den Titel die Aufgabestellung erkennen können.
/
|
Packagebeilage:
Perl-Beispiele können bei Anfängern und Perl-Evangelisten üble Irritationen verursachen und Damian Conway zur Rettung des »Guten Perl-Programmierstils« auf den Plan rufen!
Ich gebe niemals Perl-Code an Psychopathen weiter. Die bekommen von mir BASIC.
Germanistikfreaks und grammatikalisch Zwanghafte verweise ich an Hans weiter. Oder einfacher: Ich nix die Deutsch.
|
|
|
|
-

+2 replies
-
User since 2009-09-13
1192
articles
|
2010-02-06T18:10:07
GwenDragon/- Mod GwenDragon:
Ich habe mal den Titel geändert, dass auch Suchende durch den Titel die Aufgabestellung erkennen können.
/
Nicht ganz passend. Du hast die Lösung umschrieben aber nicht die Frage.
Vorschlag: "error.log des Apache während Scriptablauf"
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-
User since 2003-08-04
7295
articles
|
2010-02-06T18:13:24
biancaVorschlag: "error.log des Apache während Scriptablauf"
das wäre wiederum IMHO eine umschreibung einer lösung, du möchtest warnings abfangen. das errorlog ist unabhängig von deinem script eine datei, die vom webserver geschrieben wird.
ich finde den von GwenDragon ausgesuchten titel ok so.
|
|
|
|
|
|
-
User since 2009-09-13
1192
articles
|
Abschließend noch für Interessierte meine jetzige Lösung:
Ich gebe der Ausgabe an den Browser einen Ajax-Schnipsel mit, der dann nach Seitenaufbau nochmal beim Script fragt, ob die error.log belegt ist. Falls ja, wird eine entsprechende Anzeige auf der Seite gemacht. So ist auch immer gewährleistet, dass die zuvor gelaufene und Fehler produzierende Scriptausführung fertig und somit das error.log geschrieben ist.
Klappt ganz hervorragend.
Die Manipulation von $SIG{__WARN__} war eine gute und ebenfalls funktionierende Option, mir aber zu tief eingreifend im Vergleich zur (Un-)wichtigkeit der eigentlichen Anforderung.
Grüße und schönen Sonntag noch!
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
-
User since 2008-07-24
152
articles
|
2010-02-06T12:52:19
biancaHabe folgenden Ablauf:
- Hauptprogramm required ein anderes script und ruft darin eine sub auf
- sub erzeugt einen typischen Fehler Use of uninitialized value
- Hauptprogramm schaut, ob !-z error.log; Bedingung ist false
Kann es sein, dass der Webserver das error.log erst schreibt/schließt, wenn das Hauptprogramm beendet ist?
Gibt es eine Möglichkeit, wie das Hauptprogramm sofort nach Ausführung der sub im required Script erkennt, ob da was ins error.log kommen wird?
danke
Im Hauptprogramm
| Code: |
|
eval{require "foo.pl"}; $@ && die $@;
|
sollte ausreichend sein.
mod-edit pq: teilbaum ausgelagert
Last edited: 2010-03-07 02:29:14 +01:00
|
|
|
|
-

+2 replies
-
User since 2008-07-24
152
articles
|
2010-02-06T12:52:19
bianca- Hauptprogramm schaut, ob !-z error.log; Bedingung ist false
Es erscheint ziemlich verwegen, die Lauffähigkeit eines Programms vom Zustand der Datei error.log abhängig zu machen.
Schließlich können auch andere Prozesse in die error.log schreiben und damit den Zustand der Datei verändern.
|
|
|
|
-
User since 2009-09-13
1192
articles
|
2010-02-28T16:39:43
EscapeEs erscheint ziemlich verwegen, die Lauffähigkeit eines Programms vom Zustand der Datei error.log abhängig zu machen.
Es geht nicht um irgendwelche Abhängigkeiten.
Ich will lediglich im Rahmen der Entwicklung an meinem Projekt sofort sehen, wenn nach Ausführung des neuen Programmteils ein error.log Eintrag hängen geblieben ist.
-w, use strict und use warnings sind bei mir selbstverständlich, daher kommen ab und zu mal ein paar Einträge bei mir während der Entwicklung und die möchte ich sofort sehen. Auf diese Weise erzeuge ich nahezu fehlerfreien Code, zumindest verfolge ich diesen Anspruch ;)
|
|
10 print "Hallo"
20 goto 10
|
|
|
|
View all threads created 2010-02-06.
|