将不同文件的日志记录重定向到QPlainTextEdit

空军基地

我PyQt5应用程序是运行一个python脚本,一个GUI another_module.py,内QProcessanother_module.py具有写入的日志记录机制stdout我希望能够连接登录another_module.py并将其重定向到GUIanother_module.py中的文本框,以便将生成的所有日志都打印/追加到GUI中的文本框中。我的代码在下面。

my_gui.py

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QProcess
import logging
import another_module # This file has a sample logging mechanism which I would like to have access in my_gui.py

logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(name)s - %(levelname)s - %(message)s')

class QTextEditLogger(logging.Handler):
    def __init__(self, parent):
        super().__init__()
        self.widget = QtWidgets.QPlainTextEdit(parent)
        self.widget.setReadOnly(True)

    def emit(self, record):
        msg = self.format(record)
        self.widget.appendPlainText(msg)


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

        # Setup logging here:
        logTextBox = QTextEditLogger(self)
        logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logging.getLogger().addHandler(logTextBox) # root logging nicely redirects to logTextBox 
        logging.getLogger().setLevel(logging.DEBUG)
        another_module.logger.addHandler(logTextBox) # logging of the other file is not redirected to logTextBox
        another_module.logger.setLevel(logging.DEBUG)

        self.process = None
        self._button = QtWidgets.QPushButton(self)
        self._button.setText('Start')

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(logTextBox.widget)
        layout.addWidget(self._button)
        self.setLayout(layout)

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

    def test(self):
        logging.debug('damn, a bug')
        logging.info('something to remember')
        logging.warning('that\'s not right')
        logging.error('foobar')

        self.process = QProcess(self)
        self.process.started.connect(lambda: print('Started!'))
        self.process.finished.connect(lambda: print('Finished!'))
        self.process.startDetached('python another_module.py')


app = QtWidgets.QApplication(sys.argv)
dlg = MyDialog()
dlg.show()
dlg.raise_()
sys.exit(app.exec_())

another_module.py

import logging
import sys
import time

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s:%(name)s:%(funcName)s:%(lineno)d:%(message)s')
file_handler = logging.FileHandler('another_module.log')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

def create_some_log():
    while True:
        logger.debug('<<different file>> damn, a bug')
        logger.info('<<different file>> something to remember')
        logger.warning('<<different file>> that\'s not right')
        logger.error('<<different file>> foobar')
        time.sleep(5)

if __name__ == '__main__':
    create_some_log()

如何将内部日志记录的输出重定向another_module.py到中的文本框my_gui.py

我上面的代码运行正常,控制台显示以下信息:

 2020-10-04 22:39:23,975 - root - DEBUG - damn, a bug
 2020-10-04 22:39:23,976 - root - INFO - something to remember
 2020-10-04 22:39:23,976 - root - WARNING - that's not right
 2020-10-04 22:39:23,976 - root - ERROR - foobar
2020-10-04 22:49:27,457:__main__:create_some_log:22:<<different file>> something to remember
2020-10-04 22:49:27,457:__main__:create_some_log:23:<<different file>> that's not right
2020-10-04 22:49:27,457:__main__:create_some_log:24:<<different file>> foobar

但是,只有根日志记录才会打印到gui的文本框中:

 2020-10-04 22:39:23,975 - root - DEBUG - damn, a bug
 2020-10-04 22:39:23,976 - root - INFO - something to remember
 2020-10-04 22:39:23,976 - root - WARNING - that's not right
 2020-10-04 22:39:23,976 - root - ERROR - foobar
永乐

如果要运行用QProcess中的脚本,然后它会在不同的进程中运行这样做another_module.logger.addHandler(logTextBox)another_module.logger.setLevel(logging.DEBUG)不会改变任何东西,或意义。这种情况下的想法是使用readAllStandardOutput()方法获取日志:

import logging
import os
import sys

from PyQt5 import QtCore, QtWidgets


CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
logging.basicConfig(
    level=logging.DEBUG, format=" %(asctime)s - %(name)s - %(levelname)s - %(message)s"
)


class QTextEditLogger(logging.Handler):
    def __init__(self, parent):
        super().__init__()
        self.widget = QtWidgets.QPlainTextEdit(parent)
        self.widget.setReadOnly(True)

    def emit(self, record):
        msg = self.format(record)
        self.widget.appendPlainText(msg)


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

        # Setup logging here:
        self.logTextBox = QTextEditLogger(self)
        self.logTextBox.setFormatter(
            logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
        )
        logging.getLogger().addHandler(self.logTextBox)
        logging.getLogger().setLevel(logging.DEBUG)

        self._button = QtWidgets.QPushButton()
        self._button.setText("Start")

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.logTextBox.widget)
        layout.addWidget(self._button)

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

        self.process = QtCore.QProcess()
        self.process.readyReadStandardOutput.connect(
            self.handle_readyReadStandardOutput
        )
        self.process.started.connect(lambda: print("Started!"))
        self.process.finished.connect(lambda: print("Finished!"))

    def test(self):
        logging.debug("damn, a bug")
        logging.info("something to remember")
        logging.warning("that's not right")
        logging.error("foobar")

        script = os.path.join(CURRENT_DIR, "another_module.py")
        self.process.start(sys.executable, [script])

    def handle_readyReadStandardOutput(self):
        text = self.process.readAllStandardOutput().data().decode()
        self.logTextBox.widget.appendPlainText(text.strip())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    dlg = MyDialog()
    dlg.show()
    dlg.raise_()
    sys.exit(app.exec_())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将不同的用户重定向到不同的活动?

来自分类Dev

将不同的案例URL重定向到基础

来自分类Dev

将stdout和stderr重定向到两个不同的日志文件

来自分类Dev

重定向到记录

来自分类Dev

如何将log4j日志记录从catalina.out重定向到单独的文件?

来自分类Dev

如何将log4j日志记录从catalina.out重定向到单独的文件?

来自分类Dev

使用 awk 将不同文件中的列复制到单个文件中

来自分类Dev

针对不同文件夹的HTACCESS 404重定向不同

来自分类Dev

针对不同文件夹的HTACCESS 404重定向不同

来自分类Dev

复制项目未将错误重定向到日志文件

来自分类Dev

将整个bash会话重定向到日志文件

来自分类Dev

将我的bash的输出重定向到日志文件

来自分类Dev

将我的bash的输出重定向到日志文件

来自分类Dev

我可以将日志文件重定向到syslog吗?

来自分类Dev

无法将stdout / stderr重定向到日志文件

来自分类Dev

将系统服务日志重定向到文件

来自分类Dev

systemd:如何将stdout重定向到日志文件

来自分类Dev

Pitest:如何将日志输出重定向到文件?

来自分类Dev

如何将不同的URL重定向到同一域上的不同端口?

来自分类Dev

根据角色将不同的用户重定向到Keycloak登录上的不同页面

来自分类Dev

如何将不同的URL重定向到同一域上的不同端口?

来自分类Dev

如何使用Nginx Ubuntu 16将不同的应用程序重定向到单个域中

来自分类Dev

PHP重定向日志记录

来自分类Dev

stdout和stderr重定向到不同的文件

来自分类Dev

单击清除日志文件链接时再次重定向到日志文件,但不会清除日志文件

来自分类Dev

使用exec和tee同时将日志重定向到stdout和日志文件

来自分类Dev

将Jersey JUL日志记录重定向到Log4j2

来自分类Dev

如何防止log4j日志重定向到root记录器

来自分类Dev

Twitter日志记录(不重定向到应用程序)以及如何使用CALLBACK URL

Related 相关文章

  1. 1

    如何将不同的用户重定向到不同的活动?

  2. 2

    将不同的案例URL重定向到基础

  3. 3

    将stdout和stderr重定向到两个不同的日志文件

  4. 4

    重定向到记录

  5. 5

    如何将log4j日志记录从catalina.out重定向到单独的文件?

  6. 6

    如何将log4j日志记录从catalina.out重定向到单独的文件?

  7. 7

    使用 awk 将不同文件中的列复制到单个文件中

  8. 8

    针对不同文件夹的HTACCESS 404重定向不同

  9. 9

    针对不同文件夹的HTACCESS 404重定向不同

  10. 10

    复制项目未将错误重定向到日志文件

  11. 11

    将整个bash会话重定向到日志文件

  12. 12

    将我的bash的输出重定向到日志文件

  13. 13

    将我的bash的输出重定向到日志文件

  14. 14

    我可以将日志文件重定向到syslog吗?

  15. 15

    无法将stdout / stderr重定向到日志文件

  16. 16

    将系统服务日志重定向到文件

  17. 17

    systemd:如何将stdout重定向到日志文件

  18. 18

    Pitest:如何将日志输出重定向到文件?

  19. 19

    如何将不同的URL重定向到同一域上的不同端口?

  20. 20

    根据角色将不同的用户重定向到Keycloak登录上的不同页面

  21. 21

    如何将不同的URL重定向到同一域上的不同端口?

  22. 22

    如何使用Nginx Ubuntu 16将不同的应用程序重定向到单个域中

  23. 23

    PHP重定向日志记录

  24. 24

    stdout和stderr重定向到不同的文件

  25. 25

    单击清除日志文件链接时再次重定向到日志文件,但不会清除日志文件

  26. 26

    使用exec和tee同时将日志重定向到stdout和日志文件

  27. 27

    将Jersey JUL日志记录重定向到Log4j2

  28. 28

    如何防止log4j日志重定向到root记录器

  29. 29

    Twitter日志记录(不重定向到应用程序)以及如何使用CALLBACK URL

热门标签

归档