I know there are plenty of question about redirecting stderr in python, but i can't seem to make them work in my application.
Just for you to understand the background, I have a logger called myLogger from the logging module which output to both a file and a stream ( which output to a QTextEdit widget ) thanks to logging.FileHandler
and logging.StreamHandler
. Since I am at the debug stage of development, I also want to write to the same file the traceback of errors that may occur during deployment/test phase.
Here is my code, which output nothing except a Segmentation fault : 11.
class streamToLogger( ):
def __init__( self, name = None ):
self._logger = logging.getLogger( name )
def write( self, text, level = logging.CRITICAL ):
if text != "\n":
self._logger.log( level, text )
def flush( self ):
for handler in self._logger.handlers:
handler.flush( )
class Example( QWidget ):
def __init__( self ):
super( ).__init__( )
#UIStream = streamToUI()
l = myLogger( config, None )
sys.stderr = streamToLogger( "myLogger" )
self._initUI( )
def _initUI( self ):
self.btn = QPushButton( 'Button', self )
self.btn.resize( self.btn.sizeHint( ) )
self.btn.move( 50, 50 )
self.btn.clicked.connect( self._raiseError )
self.setGeometry( 300, 300, 300, 200 )
self.setWindowTitle( 'Test Raise error log' )
self.show()
@pyqtSlot()
def _raiseError( self ):
a = 1 / 0
if __name__ == '__main__':
app = QApplication( sys.argv )
ex = Example( )
sys.exit( app.exec_( ) )
Edit
Here is the code of myLogger class :
class myLogger():
def __init__( self, configObject, stream = None ):
self.logger = logging.getLogger( "myLogger" )
self.logger.setLevel( logging.DEBUG )
self._format = "%(asctime)s - %(levelname)s - %(threadName)s, %(funcName)s - %(message)s"
self._level = 10
self.streamHandler = self._setStreamHandler( stream )
self.logger.addHandler( self.streamHandler )
self.fileHandler = self._setFileHandler()
self.logger.addHandler( self.fileHandler )
def _setFileHandler( self ):
fileName = "testLog.log"
tempHandler = logging.FileHandler( fileName, mode = "a+" )
myFormatter = logging.Formatter( self._format )
tempHandler.setFormatter( myFormatter )
tempHandler.setLevel( self._level )
return tempHandler
def _setStreamHandler( self, stream ):
tempHandler = logging.StreamHandler( stream )
myFormatter = logging.Formatter( self._format )
tempHandler.setFormatter( myFormatter )
level = 10
tempHandler.setLevel( self._level )
return tempHandler