Я новичок в питоне. Надеюсь, кто-то может мне помочь. Я строю проект со структурой ниже.
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.