Я застрял в ужасно удивительной проблеме, которую не могу понять.
Речь идет о Python 3.6.4 и tkinter 8.6 и встроенном протоколировании lib.
Во-первых, вот класс "MyLogger":
# file: logger.py
import logging.handlers
GENERIC_FORMAT = "%(asctime)s :: %(levelname)-8s :: '%(name)s' :: %(module)s.%(funcName)s :: proc=%(process)d :: %(message)s (%(filename)s:%(lineno)d)"
class MyLogger(logging.Logger):
""" Main logger """
def __init__(self, level=logging.DEBUG, filehandler=None, consolemode=True):
self.fmt = logging.Formatter(GENERIC_FORMAT)
logging.Logger.__init__(self, name='my_logger', level=level)
if filehandler is not None:
self.setup_filehandler(filehandler)
if consolemode:
console_handler = logging.StreamHandler()
console_handler.setFormatter(self.fmt)
self.addHandler(console_handler)
def setup_filehandler(self, filehandler):
file_handler = logging.handlers.RotatingFileHandler(
filename=filehandler, mode='a', maxBytes=1e+7, backupCount=10)
file_handler.setFormatter(self.fmt)
self.addHandler(file_handler)
Примечание: при создании экземпляра он создает регистратор с именем 'my_logger'
Тогда мое основное приложение:
# file: main_application.py
from tkinter import Tk
import logging
import os
from logger import MyLogger
from myframe import MyFrame
# Logger main instance
logger = MyLogger(level=logging.DEBUG)
def MyFrameRunner():
root = Tk()
root.geometry("450x450+400+150")
MyFrame(root)
root.mainloop()
def main():
# Set the filehandler for the main L6 logger
logfile = os.path.join(os.getcwd(), "MYTOOL.log")
if not os.path.exists(os.path.dirname(logfile)):
os.makedirs(os.path.dirname(logfile))
logger.setup_filehandler(filehandler=logfile)
# It logs successfully into sdterr and $SW_PATH/MYTOOL.log file !!
logger.info("Let's go !!")
MyFrameRunner()
if __name__ == '__main__':
main()
Примечание: , как уже упоминалось, logger.info в main / main_application.py успешно регистрируется в файлах sdterr (StreamHandler) и $ SW_PATH / MYTOOL.log (RotatingFileHandler) !!
Наконец, MyFrame:
# file : myframe.py
from tkinter import *
import logging
# With the same name as defined in MyLogger class
logger = logging.getLogger('my_logger')
class MyFrame(Frame):
def __init__(self, master, **kw):
logger.info("Here is my frame !!")
Frame.__init__(self, master)
И моя проблема:
С помощью приведенного выше кода невозможно перехватить регистратор с именем my_loger с помощью logging.getLogger ('my_logger') в myframe.py.
нет ошибки , но нет "журнала" ни в sdterr (StreamHandler), ни $ SW_PATH / MYTOOL.log файл (RotatingFileHandler).
Вопрос:"нормально", что в основном цикле Tk () нет способа "пропустить регистратор" (фактически, перехватить регистратор)?
Единственный «вывод журнала», который я получаю:
2018-10-29 17:03:32,871 :: INFO :: 'my_logger' :: main_application.main :: proc=21484 :: Let's go !! (main_application.py:31)
В то время как я исключил:
2018-10-29 17:03:32,871 :: INFO :: 'my_logger' :: main_application.main :: proc=21484 :: Let's go !! (main_application.py:31)
2018-10-29 17:03:xx,xxx :: INFO :: 'my_logger' :: myframe.MyFrame :: proc=21484 :: Here is my frame !! (myframe.py:15)
Спасибо большое !!