Reputation: 70
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
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
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