CacO3
CacO3

Reputation: 70

How can I change the format of a custom logger?

I have a simple FreeSimpleGui application (PySimpleGui). It shows a text window and there is a custom logger which writes to that text window:

How is it possible to change the format of the custom logger? I seem only to be able to change the config of the root logger, but my custom logger just ignores it.


import FreeSimpleGUI as sg
import logging

class OutputHandler(logging.Handler):
    window: sg.Window

    def __init__(self, window: sg.Window):
        super().__init__()
        self.window = window

    def emit(self, record):
        self.window["txtLog"].print(record)


layout = [
    [sg.Multiline(default_text="", size=(100, 10), disabled=True, autoscroll=True, key="txtLog")]
]

window = sg.Window('Form', layout, finalize=True)

outHandler = OutputHandler(window)


log = logging.getLogger("root")
log.setLevel(logging.INFO)
log.addHandler(outHandler)


i = 0

while True:
   event, values = window.read(timeout = 1000, timeout_key=sg.TIMEOUT_KEY, close=False)
   if event == sg.WIN_CLOSED or event == 'Exit':
      break
   logging.info("Hello World " + str(i))
   i += 1

window.close()

Upvotes: 0

Views: 43

Answers (2)

Shriyash Warghade
Shriyash Warghade

Reputation: 213

To create a custom logger that writes to a PySimpleGUI Multiline element, you can define a custom logger class that updates the Multiline element each time a new log message is added

import PySimpleGUI as sg
import logging

class CustomLogger:
    def __init__(self, text_element):
        self.text_element = text_element
        
    def log(self, message):
        self.text_element.Update(self.text_element.Get() + message + '\n')

layout = [
    [sg.Text('Log Window')],
    [sg.Multiline(size=(60, 20), key='-LOG-', autoscroll=True, disabled=True)],
    [sg.Button('Exit')]
]

window = sg.Window('Logger Example', layout)
logger = CustomLogger(window['-LOG-'])

logger.log('Info: Log message.')

while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == 'Exit':
        break

window.close()

Upvotes: 1

keria
keria

Reputation: 181

record in your emit function is a logging.LogRecord object, which haven't been formatted yet, you can make a formatted string with attributes of record:

def emit(self, record):
    message = "%s:%s" % (record.pathname, record.msg)
    self.window["txtLog"].print(message)

or make a formatted string with help of logging's Formatter:

def emit(self, record):
    if self.formatter:
        message = self.formatter.format(record)
    else:
        message = record
    self.window["txtLog"].print(message)

...
format = logging.Formatter(
    fmt="%(pathname)s:%(message)s",
    style="%"
)
outHandler = OutputHandler(window)
outHandler.setFormatter(format)

log = logging.getLogger("mylogger")
log.setLevel(logging.INFO)
log.addHandler(outHandler)
...

Upvotes: 2

Related Questions