Seite 1 von 1

stderr Ausgabe umleiten und...

Verfasst: Freitag 20. Oktober 2006, 19:22
von DatenMetzgerX
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

Re: stderr Ausgabe umleiten und...

Verfasst: Freitag 20. Oktober 2006, 21:12
von gerold
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
:-)

Verfasst: Freitag 20. Oktober 2006, 22:12
von DatenMetzgerX
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:

Verfasst: Samstag 21. Oktober 2006, 11:57
von DatenMetzgerX
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)

Verfasst: Sonntag 22. Oktober 2006, 19:17
von DatenMetzgerX
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?

Verfasst: Sonntag 27. April 2008, 07:16
von Jan-Peer
Hallo,

ich sitze gerade an einer vergleichbaren Problematik. Hast du damals noch eine befriedigende Lösung für das Logging aus der MainLoop gefunden?

Verfasst: Sonntag 27. April 2008, 14:28
von DatenMetzgerX
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!

Verfasst: Sonntag 27. April 2008, 16:22
von Jan-Peer
Ja, vielen Dank!