Лучший способ управлять входом в проект Python - PullRequest
0 голосов
/ 20 июня 2019

Я новичок в питоне. Надеюсь, кто-то может мне помочь. Я строю проект со структурой ниже.

main.py - sqlconn.py - runlogic.py

Я читал о корневых регистраторах и надеялся использовать его, чтобы каскадировать свойства для всех модулей. Поэтому я определил регистратор, как показано ниже в моем файле main.py.

Также мое требование - иметь все уровни INFO для перехода в sysout. ОШИБКИ уровня оповещения к таблице базы данных вместе с sysout.

ПРОБЛЕМА: Это прекрасно работает до того момента, когда я получаю исключение подключения к БД. Это своего рода бросает регистратор в бесконечный цикл, и обработчик журналов продолжает пытаться соединиться и войти в базу данных.

Ниже приведен код Customhandler для входа в БД.

# Define root logging settings to propagate properties and handlers to child modules 
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)

    # Create logging formatter 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # Create error handler for logging to Database table with a higher logging level.
    log_db_handler = LogDbHandler(logsfclient, runid, jobid, stepid)      
    log_db_handler.setLevel(logging.ERROR)

    sysout_handler = logging.StreamHandler(sys.stdout)
    sysout_handler.setLevel(logging.INFO)

    # Add it to the handler
    log_db_handler.setFormatter(formatter)
    sysout_handler.setFormatter(formatter)

    # Add the handler to the logger
    root_logger.addHandler(log_db_handler)  
    root_logger.addHandler(sysout_handler)

class LogDBHandler(logging.Handler):
    '''
    Customized logging handler that puts error logs to the snowflake database table.
    '''
    def __init__(self, sfclient, runid, jobid, stepid):
        logging.Handler.__init__(self)
        self.counter =0 
        self.runid = runid
        self.jobid = jobid
        self.stepid = stepid
        self.snowflakeclient= sfclient

        config = ConfigurationManager().get_config()

    def emit(self, record):
        # Set current time
        self.counter +=1
        current_tmstmp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.log_msg = str(record.msg)
        self.log_msg = self.log_msg.strip()
        self.log_msg = self.log_msg.replace('\'', '\'\'')

        # Generate the SQL statement to udpate error log in details table
        updatesql =  "UPDATE {} SET STATUS ='FAILED', STEP_END_DATE='{}', ERROR_LOG='{}' WHERE JOB_ID = {} AND RUN_ID = {} AND STEP_ID={}".format(self.joblogdtlstbl, current_tmstmp, self.log_msg, self.jobid, self.runid, self.stepid)

        print ("Sql generated for logging: {}".format(updatesql))

        try:
            print ("Logging error in job dtl table ..")
            print "Invoke counter {}".format(self.counter)
            self.snowflakeclient.exec_query(updatesql)
        except Exception as e:
            print ("Log handler failed to write into database..".format(str(e)))   ### This has been marked as info so that it doesnt trigger the handler if db fails to connect.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...