stderr Ausgabe umleiten und...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Hallo

Habe folgendes Problem...
Ich begann mit logging in meinem Programm Logs hinzuzufügen. Nun hätte ich allerdings gerne, das auch stderr umgeleitet wird, in das Logfile schreibt.

Bis anhin keine grosse Sache, nun aber zu meinem Problem...
Wenn ein Traceback ausgegeben wurde (nur dann wird stderr verwendet), hätte ich gerne die ganze traceback meldung in eienr liste zusammengeknäult ;), damit ich ein kleines Fenster öffnen kann, womit der Benutzer mir dann den Traceback und ggf. eine Fehlermeldung senden kann.

Ist das irgend wie möglich?
Greeze DM
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:hätte ich gerne die ganze traceback meldung in eienr liste zusammengeknäult
Hi DM!

Vielleicht kannst du da etwas für dich raus holen:

Code: Alles auswählen

#!/usr/bin/env python -O
# -*- coding: iso-8859-1 -*-

try:
    f = file("mich_gibt_es_nicht.txt")
except Exception, inst:
    import traceback, sys
    tb = traceback.format_tb(sys.exc_traceback)
    print "-"*80
    print "Fehler:         %s" % inst
    print "Startmodul:     %s" % sys.argv[0].strip()
    print "Zeilennummer:   %s" % traceback.tb_lineno(sys.exc_traceback)
    print "Dateiname:      %s" % tb[0].split(",")[0].strip()[6:-1]
    print "-"*80
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

So kurz getestet scheint es zu funktionieren, allerdings sind die tracebacks von python ein wenig ausführlicher :roll: (Vorallem der Verlauf des Programmes wäre nice :) )

Zusätzlich habe ich noch folgendes Problem ...

Wie kann ich ein Try ... except um meine ganze wxpython anwendung legen...

Code: Alles auswählen

    sys.stdout = output.stdout()
    sys.sterr = output.stderr()
    try:
        app = wx.PySimpleApp(False)
        frame = MainFrame(None)
        frame.Show()
        app.SetTopWindow(frame)
        app.MainLoop()
    except Exception, ex:
        sys.stderr.write(None, ex)
Er fängt die Exception nicht ab :roll:
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Hier meine Lösung...

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import data
import os
import logging
        
class logger(object):
    log = None
    @staticmethod
    def getInstance():
        if logger.log is None:
            logger.log = logging
            logger.log.basicConfig(level = logging.DEBUG,
                              format='%(asctime)s %(levelname)s: %(message)s',
                              filename = os.path.join(data.PATH, 'logfile.log'),
                              filemode='w')
            msg = os.linesep * 2 +  30*'-' + os.linesep + "Logger wurde gestartet" + os.linesep+ 30 *'-' + os.linesep * 2
            logger.log.info(msg)
        return logger.log
    
class stdout(object):
    def __init__(self):
        self.__log = logger.getInstance()
    
    def write(self, t):
        if not t == '\n' and t:
            self.__log.info(t)
            
class stderr(object):
    def __init__(self):
        self.__log = logger.getInstance()
        
    def write(self, ex):
        self.__log.exception(ex)
        
    def stdout(self, t):
        self.write(t)
        
if __name__ == '__main__':
        try:
            import sys
            sys.stdout = stdout()
            sys.stderr = stderr()
            print 'INFOS'
            sys.stderr.write('uiii')
            k.kw()
        except Exception, ex:
            sys.stderr.write(ex)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Es geht leider doch noch nicht ganz :(

alle FEhler die nach dem app.MainLoop() auftregen fänt mein try: ... except nicht ab. Wüsste noch jemand, was ich machen könnte?
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Hallo,

ich sitze gerade an einer vergleichbaren Problematik. Hast du damals noch eine befriedigende Lösung für das Logging aus der MainLoop gefunden?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Ich kann dir nicht sagen, ob es nun wierklich funktioniert... habe das Projekt irgend wann stillgelegt...

http://paste.pocoo.org/show/44339/

output.py regeld das Exception handling... das onerror ist ein Fenster, dass im Falle eines Fehlers angezeigt wird -> Bei fehler vor dem initialisieren der App knallt es, denn die App muss ja zuerst initialisiert sein.

Es ist sicherlich noch überarbeitungs fähig, auch könnte man den Programmierstiel noch verbessern, jedoch funktioniert es im gross und ganzem...

Ich hoffe, dass es dir hilft!
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Ja, vielen Dank!
Antworten