umleitung der fehlerausgabe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Gast

umleitung der fehlerausgabe

Beitragvon Gast » Donnerstag 12. Februar 2004, 21:46

hallo zusammen

ich habe meine cgi skripten immer in einem try, except block, um fehler auswerten zu können, da ich ja bei meinem webprovider den errorlog nicht einsehen kann. das ist sehr nützlich wenn ich vergessen habe z.b. einen pfad anzupassen, der auf meinem lokalen server anders lautet. nun werden aber nicht alle fehler umgeleitet. syntax error kann ich trotz folgenden code nicht einsehen:



allerlei übliches wie interpreter

einige imports

dann...

Code: Alles auswählen

try:

   print "irgendwas"

except:
    pfad='/var/www/html/crossover/'
    dateiname='fehler.txt'
    text=pfad+dateiname
    sys.stderr=open(text, 'a')
    print traceback.print_exc(sys.exc_info()[2])
    sys.stderr.close()




was muss ich im exceptblock ändern, dass alle fehler dort hingeschrieben werden?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 12. Februar 2004, 21:56

Hi rolgal,

eigentlich sollte es genügen, in einem deiner Module sys.stderr auf eine Datei umzuleiten (als Textdatei zu öffnen), statt alles mit try:...except: abzufangen.


Gruß

Dookie
Gast

Beitragvon Gast » Donnerstag 12. Februar 2004, 22:00

hi dookie!

wie meinst du das jetzt?

ich habe in webtools eine funktion geschrieben, die den code vom except block enthält.

also eigentlich steht dann bei except, weil alles von webtools importiert wird fehlerschreiben()

aber um den try, except block kann ich doch nicht umherkommen, oder?

:?:

mfg

rolgal
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 12. Februar 2004, 22:38

hmm mir gefällt es nicht, wenn alle exceptions abgefangen werden, im Fehlerfall läuft dann das script weiter mit unter umständen fatalen folgen.
Um die Fehlermeldungen und Warnungen von Python mitzuprotikollieren, genügt ein
sys.stderr = file("pfad_zum/fehlerlog.txt","a",0)
ohne es gleich zu schließen.


Gruß

Dookie
Gast

Beitragvon Gast » Freitag 13. Februar 2004, 00:06

hi dookie!

stimmt natürlich wieder mal , was du schreibst.

nur, ist es nicht problematisch die datei nicht zu schliessen?

und was kann ich tun, dass auch ein syntaxerror in diese datei geschrieben wird?

danke für deine hilfe!

mfg

rolgal
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 13. Februar 2004, 00:39

in dem Fall ists nicht problematisch die Datei nicht zu schließen, erstens wird sie mit dem 3. Parameter "0" ungepuffert geöffnet, also die Ausgabe wird gleich in die Datei geschrieben, und 2. wird die Datei beim Beenden des scripts sowieso geschlossen.

Um auch die Syntaxfehler in die Datei umzuleiten, musst Du, beim Starten des Scripts, die Fehlerausgabe des Interpreters schon in die Datei umleiten. Unter Linux/Unix mit
python script.py 2>> /var/www/html/crossover/fehler.txt
Es sollte auch gehen, wenn Du als erste Zeile im Script

Code: Alles auswählen

#!/usr/bin/env python 2>> /var/www/html/crossover/fehler.txt

verwendest.


Gruß

Dookie
Gast

Beitragvon Gast » Freitag 13. Februar 2004, 09:51

hm :?

ich kann wieder mal nur bedingt folgen. heisst das, dass das script das als modul importiert wird so aussehen müsste?

Code: Alles auswählen

#!/usr/local/bin/env python 2>> /var/www/html/crossover/fehler.txt
#!/usr/local/bin/python

import sys, traceback, smtplib, cgi, re

sys.stderr = file("/var/www/html/crossover/fehler.txt","a",0)


def mailsenden(empfaenger,absender,betreff,nachricht):
    msg="To: %s\n" %empfaenger
    msg=msg+"From: %s\n" %absender
    msg=msg+"Subject: %s\n\n" %betreff
    msg=msg+str(nachricht)
    server=smtplib.SMTP('localhost')
    server.sendmail(absender, empfaenger, msg)
    server.close()

ich habe local eingefügt weil ja der interpreter auch dort ist.
leider funktioniert es nicht, aber vielleicht habe ich dich falsch verstanden, deshalb poste ich das modul mal.

danke dir.

mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 13. Februar 2004, 10:07

Hi. Was du mittels der Umleitung von sys.stderr gebastelt hast ist bestimmt auch funktionstauglich und gut, aber ich würde es nicht verwenden: es geht wieder mal einfacher, weil Python die Mittel onBoard hat. Mach mal am Scriptanfang einfach das:

Code: Alles auswählen

import cgitb
cgitb.enable()

Nun werden Fehler im Browser angezeigt, als ob du in der Shell arbeitest. Falls das unerwünscht ist, kannst du das ganze auf in Dateien mitloggen lassen, ganz wie du willst (und auch da wahlweise in HTML oder plain Text; weitere Funktionen von cgitb sind hier)

Code: Alles auswählen

cgitb.enable(0,'.')


Syntaxfehler können auf diese Weise niemals abgefangen werden, aber man kann das Script vor dem hochladen auf den Server ja mal in der Shell ausführen und da werden gleich am Anfang, falls vorhanden, die Syntaxfehler angezeigt.

mfg. Milan
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 13. Februar 2004, 10:35

Dookie hat geschrieben:Um auch die Syntaxfehler in die Datei umzuleiten, musst Du, beim Starten des Scripts, die Fehlerausgabe des Interpreters schon in die Datei umleiten. Unter Linux/Unix mit
python script.py 2>> /var/www/html/crossover/fehler.txt
Es sollte auch gehen, wenn Du als erste Zeile im Script

Code: Alles auswählen

#!/usr/bin/env python 2>> /var/www/html/crossover/fehler.txt

verwendest.


So, ich hab mir den Rest jetzt mal zu gemüte geführt, vorher nur überflogen... Ist es überhaupt möglich, bei cgi-Scripten eine Umleitung von Anfang an zu machen? Und wenn ja, ist das nicht extrem problematisch, da ja eigentlich die Ausgaben an den Apache und nicht an eine Datei geleitet werden sollen, oder? Von daher hätte ich so meine Bedenken bei der Sache. Bei Shellscripten sicher kein Problem, bei cgi-Scripten doch schon eher.

Milan
Gast

Beitragvon Gast » Freitag 13. Februar 2004, 10:55

hi milan!

ja klar das mit cgitb.enable() geht natürlich auch, habe ich aber weggetan, weil mein provider noch ne pythonversion hatte, die das nicht unterstützt hat. inzwischen hat er, wie ich woanders schon erwähnte, ein update gemacht. mein hirn ist da natürlich nicht gleich auf die idee gekommen die sache wieder über cgitb.enable zu machen.

es funktioniert so und so, aber ich will eben auch die syntaxfehler, also einfach alle fehler haben, wenn es denn realisierbar ist.

danke, dass du mich an die möglichkeit erinnert hast!


mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 13. Februar 2004, 11:07

Hi. Wie gesagt, das mit den Syntaxerror wird sehr schwer, denn wenn ein solcher existiert, wird dein Script gar nicht erst ausgeführt, sondern gleich deswegen beendet. Da kann auch keine Umleitung erfolgen, wenn ie nicht von Anfang an besteht. Das halte ich jedoch für problematisch, wenn man nicht explizit nur den Fehlerkanal statt allen (also nur sys.stderr statt sys.stdout und sys.stderr) umleiten kann. Ich halte das für nicht realisierbar.

rogal hat geschrieben:ja klar das mit cgitb.enable() geht natürlich auch, habe ich aber weggetan, weil mein provider noch ne pythonversion hatte, die das nicht unterstützt hat.

Versteh ich ehrlich gesagt nicht... die Module die cgitb verwendet dürften in allen Pythonversionen vorhanden sein, daher kann man doch einfach von einer neueren Version die cgitb.py in sein cgi-bin Verzeichniss tun. So kann man die dann doch auch benutzen, oder? Ich habs jedenfalls bei ähnlichen Fällen immer so gehandhabt...

Milan
Gast

Beitragvon Gast » Freitag 13. Februar 2004, 11:13

hallo milan!

Versteh ich ehrlich gesagt nicht... die Module die cgitb verwendet dürften in allen Pythonversionen vorhanden sein, daher kann man doch einfach von einer neueren Version die cgitb.py in sein cgi-bin Verzeichniss tun.


ja, soweit habe ich nicht gedacht, ich habe gesehen, dass mein provider pyhton 2.1.0 hatte und da ist dieses programm standardmäßig noch nicht dabei!

Ich werde wohl meine grundsätzliche herangehensweise bei der lösung eines problems überdenken müssen.

:D

was den syntaxerror angeht: wichtig wäre er mir nur deshalb, wenn ich ein skript online editiere. wenn ich einen murks baue, dann wird es schwer ihn zu finden.

mfg
rolgal
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 13. Februar 2004, 12:17

Hallo nochmal.

also das mit dem Umleiten des Fehlerkanals in eine Datei funktioniert nur beim direkten Start eines Scripts, nicht erst wenn ein Modul importiert wird. Also das Script, dessen URI Du im Browser eintippst, dessen Fehlerkanal sollte sich auf die von mir beschriebene art und weise umleiten lassen.

@Milan: sys.stdout wird an den Apache geschickt um an den Browser gesendet zu werden, sys.stderr anscheinend nicht, sonst würde rolgal ja Fehlermeldungen im Browser angezeigt bekommen, auch Syntaxfehler.


Gruß

Dookie
Gast

Beitragvon Gast » Freitag 13. Februar 2004, 12:32

hi dookie!

aber wie soll ich das beim start des scripts machen? das script wird ja über action="../cgi-bn/script.py" aufgerufen.

ich sitze sicher wieder mal :(

mfg

rolgal
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 13. Februar 2004, 12:47

falls Du an das script.py herankommst, kannst Du da versuchen die Umleitung, wie von mir beschrieben, in der ersten zeile anzugeben. Oder, wenn möglich, das script über action="../cgi-bn/script.py 2>>/var/www/html/crossover/fehler.txt" starten lassen.


Gruß

Dookie

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder