1

同様のタイトルの他のスレッドでは、まだ答えが見つかりません。次のような logging.conf があるとします。

[loggers]
keys=root,analyzer

[handlers]
keys=consoleHandler,analyzerFileHandler

[formatters]
keys=consoleFormatter,logFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,analyzerFileHandler

[logger_analyzer]
level=DEBUG
handlers=consoleHandler,analyzerFileHandler
qualname=analyzer
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=consoleFormatter
args=(sys.stdout,)

[handler_analyzerFileHandler]
class=FileHandler
level=DEBUG
formatter=logFormatter
args=('analyzer.log','w')

[formatter_consoleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s | %(message)s
datefmt=%m/%d/%Y %X

[formatter_logFormatter]
format=%(asctime)s - %(levelname)s | %(message)s
datefmt=%m/%d/%Y %X

logger = logging.getLogger('analyzer')はテキストをログ ファイルとコンソールに送信しますが、その sys.stdout をコンソールではなく QPlainTextEdit() ウィジェットに送信するにはどうすればよいですか?

編集

この投稿を見て、このコードを作成しました。投稿のコードは優れていますが、何らかの理由で問題に対処していません.ロガーのすべてのインスタンスをコメントアウトしても、印刷イベントがQwidgetに送られます. ロガーは、そのままでは、プログラムの残りの部分と実際に対話することはなく、ただそこにあるだけです。必要なものをテキストとして取得し、それぞれ印刷とロガーに送信するクラスを作成することで、問題を修正できると思いました。

import logging
from logging.config import fileConfig
from os import getcwd
import sys

from PyQt4.QtCore import QObject,\
                         pyqtSignal

from PyQt4.QtGui import QDialog, \
                        QVBoxLayout, \
                        QPushButton, \
                        QTextBrowser,\
                        QApplication

class XStream(QObject):
    _stdout = None
    _stderr = None

    messageWritten = pyqtSignal(str)

    def flush( self ):
        pass

    def fileno( self ):
        return -1

    def write( self, msg ):
        if ( not self.signalsBlocked() ):
            self.messageWritten.emit(unicode(msg))

    @staticmethod
    def stdout():
        if ( not XStream._stdout ):
            XStream._stdout = XStream()
            sys.stdout = XStream._stdout
        return XStream._stdout

    @staticmethod
    def stderr():
        if ( not XStream._stderr ):
            XStream._stderr = XStream()
            sys.stderr = XStream._stderr
        return XStream._stderr

class XLogger():
    def __init__(self, name):
        self.logger = logging.getLogger(name)
    def debug(self,text):
        print text
        self.logger.debug(text)
    def info(self,text):
        print text
        self.logger.info(text)
    def warning(self,text):
        print text
        self.logger.warning(text)
    def error(self,text):
        print text
        self.logger.error(text)

class MyDialog(QDialog):
    def __init__( self, parent = None ):
        super(MyDialog, self).__init__(parent)

        # setup the ui
        self._console = QTextBrowser(self)
        self._button  = QPushButton(self)
        self._button.setText('Test Me')

        # create the layout
        layout = QVBoxLayout()
        layout.addWidget(self._console)
        layout.addWidget(self._button)
        self.setLayout(layout)

        # create connections
        XStream.stdout().messageWritten.connect( self._console.insertPlainText )
        XStream.stderr().messageWritten.connect( self._console.insertPlainText )

        self.xlogger = XLogger('analyzer')

        self._button.clicked.connect(self.test)

    def test( self ):

        # log some stuff
        self.xlogger.debug("Testing debug")
        self.xlogger.info('Testing info')
        self.xlogger.warning('Testing warning')
        self.xlogger.error('Testing error')

if ( __name__ == '__main__' ):
    fileConfig(''.join([getcwd(),'/logging.conf']))

    app = None
    if ( not QApplication.instance() ):
        app = QApplication([])

    dlg = MyDialog()
    dlg.show()

「クロスロガー」はすべてをログと Qwidget に送信しますが、デバッグ以外のすべてを aptana コンソールにも送信します。

02/05/2013 17:38:42 - analyzer - INFO | Testing info
02/05/2013 17:38:42 - analyzer - WARNING | Testing warning
02/05/2013 17:38:42 - analyzer - ERROR | Testing error

Analyzer.log には次の情報があります。

02/05/2013 17:38:42 - DEBUG | Testing debug
02/05/2013 17:38:42 - INFO | Testing info
02/05/2013 17:38:42 - WARNING | Testing warning
02/05/2013 17:38:42 - ERROR | Testing error

debug だけが Aptana コンソールに到達しないのは奇妙です。logging.confの [logger_analyzer] の下のハンドラーからconsoleHandlerを削除すると、Aptana コンソールに書き出す問題が解決します。 [handler_consoleHandler] の下のargs=(sys.stdout,) 。Qtext オブジェクトのハンドラーをコーディングして logging.conf ファイルを無効にすることなく、問題を解決できると思います。コンソール出力を任意の Qwidget にリダイレクトする logging.conf ファイルを使用するためのより洗練されたソリューションを誰かが持っている場合は、お気軽に投稿してください。ありがとう。

4

0 に答える 0