Python3.6 logging.getLogger ("mylogger") в Tk.mainloop () не кэшируется - PullRequest
0 голосов
/ 29 октября 2018

Я застрял в ужасно удивительной проблеме, которую не могу понять.

Речь идет о 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)

Спасибо большое !!

1 Ответ

0 голосов
/ 30 октября 2018

Можно сделать, передав «logger» в качестве одного из аргументов MyFrame:

Редактировать в main_application.py :

# 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")
    # Old: MyFrame(root)
    MyFrame(root, logger)
    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()

Редактировать в myframe.py :

# file : myframe.py

from tkinter import *
import logging
from logger import MyLogger

# With the same name as defined in MyLogger class
logger = logging.getLogger('my_logger')


class MyFrame(Frame):
    # Old: def __init__(self, master, **kw):
    def __init__(self, master, logger=MyLogger(), **kw):
        logger.info("Here is my frame !!")
        Frame.__init__(self, master)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...