python проблем с логированием с несколькими python файлами - PullRequest
0 голосов
/ 07 апреля 2020

У меня проблема с объектом журнала с несколькими файлами python. Кто-то может пролить свет на то, как инициализировать файл журнала после всего импорта? Перемещение ниже строки утилиты импорта выдает ошибку ключа.

my_logger.setup_logger ("log_file.txt")

utils.py вызывает my_logger.get_logger () до инициализации объекта регистратора.

Как решить эту проблему?

main.py

#!/usr/bin/python3
import my_logger
# Moving setup_logger below "import utils" causing issue
my_logger.setup_logger("log_file.txt")
import utils
import logging
logger = my_logger.get_logger()
# my_logger.setup_logger("log_file.txt") # <<<<<< This line causing the issue  
if __name__ == "__main__":
    my_logger.set_log_context("init: ")
    logger.info("Start")
    utils.init()
    my_logger.set_log_context("post init: ")
    utils.done()

utils.py

import my_logger
logger = my_logger.get_logger()

def init():
    logger.info("Proc init started")
def done():
    logger.info("Proc Done.")

my_logger.py

import logging
from logging.handlers import RotatingFileHandler

extra = {'log_context': ''}

def set_log_context(context):
    global extra
    extra['log_context'] = context

def get_log_context():
    global extra
    return extra

class Custom_Logger(logging.Logger):
    def _log(self, level, msg, args, exc_info=None, extra=None):
        if extra is None:
            extra=get_log_context()
        super(Custom_Logger, self)._log(level, msg, args, exc_info,extra)

def setup_logger(file_name):
    FORMAT = "%(log_context)s%(message)s"
    logging.basicConfig(level=logging.INFO, format=FORMAT)
    logging.setLoggerClass(Custom_Logger)
    # logging.setLoggerClass(Custom_Logger)
    logger = logging.getLogger("main_logger")

    # Log file size set 1 mb
    lfh = RotatingFileHandler(file_name, maxBytes=1*1024*1024, backupCount=5)
    lfh.setLevel(logging.DEBUG)
    lch = logging.StreamHandler()
    lch.setLevel(logging.INFO)
    info_format = logging.Formatter("%(log_context)s%(message)s")
    debug_format = logging.Formatter("[%(filename)s:%(funcName)s:%(lineno)s]"
                                     " %(log_context)s%(message)s")
    lfh.setFormatter(debug_format)
    lch.setFormatter(info_format)
    logger.addHandler(lch)
    logger.addHandler(lfh)

def get_logger():
    return logging.getLogger("main_logger")

Ошибка:

KeyError: 'log_context'
Call stack:
  File "C:/Users/rnaveenk/PycharmProjects/logger_test/main.py", line 16, in <module>
    utils.done()
  File "C:\Users\rnaveenk\PycharmProjects\logger_test\utils.py", line 7, in done
    logger.info("Proc Done.")
Message: 'Proc Done.'
Arguments: ()
...