본문 바로가기

프로그래밍

logging을 이용한 ui 내 로그 출력

QtDesiger로 그린 화면에 프로그램의 로그를 출력해보자.
 
핵심은 logging.handler를 상속받은 사용자 정의 핸들러를 이용하는 것이다.
 
우선 핸들러를 하나 만들자.
 
class LogStringHandler(logging.Handler):

   def __init__(self, target_widget):
       # 포맷터 및 레벨, 출력할 대상 위젯 설정
       super(LogStringHandler, self).__init__()
       self.target_widget = target_widget

   def emit(self, record):
       # 대상 위젯에 로그 내용을 추가한다.
       self.target_widget.append(record.asctime + ' -- ' + record.getMessage())​
 
 
생성자에 대상 위젯을 넣어서 멤버로 할당하고, 로그 변화 발생 시 해당 위젯에 기록하게끔 설정한다.
 
QtWidget들 중에 QtTextBrowser를 사용하기로 정했다.
append()를 사용하면 내용 뒤에 새로운 내용을 붙여 넣을 수 있다.

 

 
record의 맴버중 asctime은 logging.basicConfig()를 통해 포메터에 대상을 출력하도록 정했을 때 사용할 수 있다.
ex)logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 
 
전체 코드는 아래와 같다.
 
 
import sys
import logging

from PyQt5.QtWidgets import *
from PyQt5 import uic

test_ui_class = uic.loadUiType("../ui/test_window.ui")[0]

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


class LogStringHandler(logging.Handler):

    def __init__(self, target_widget):
        super(LogStringHandler, self).__init__()
        self.target_widget = target_widget

    def emit(self, record):
        self.target_widget.append(record.asctime + ' -- ' + record.getMessage())

class TestWindow(QMainWindow, test_ui_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        logger = logging.getLogger()
        logger.addHandler(LogStringHandler(self.testTextBrowser))

        # 이벤트 연결
        self.testButton.clicked.connect(self.clicked_test_button)

    def clicked_test_button(self):
        message_alert = self.test_logging()
        QMessageBox.about(self, 'testButton 눌림 알람', message_alert)

    def test_logging(self):
        total_repeat_count = int(self.countTempDummy.text() if self.countTempDummy.text() != '' else 0)
        if total_repeat_count <= 0:
            return '출력 대상이 없음'
        for i in range(0, total_repeat_count):
            logging.error('Error %s ' % i)
            logging.info('Info %s ' % i)
            logging.warning('Warning %s ' % i)
            logging.debug('Debug %s ' % i)
        return '로그 출력 완료'


if __name__ == "__main__":
    app = QApplication(sys.argv)
    test_window = TestWindow()
    test_window.show()
    app.exec_()