Index: /branches/rel_apv_10_7/usr/click/tools/aws/AWSAuthManager.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/AWSAuthManager.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/AWSAuthManager.py	(working copy)
@@ -3,7 +3,7 @@
 
 from aws_auth.AWSAuthController import AWSAuthController
 from logger.ProxyAWSLogger import ProxyAWSLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class AWSAuthManager():
@@ -78,7 +78,6 @@
             print(log_in_info)
         except Exception as e:
             ProxyAWSLogger.error(str(e))
-            webuiLogger = ProxyWebUILogger()
             webuiLogger.debug(f"Cannot get login information. The reason is: {str(e)}")
 
     @classmethod
Index: /branches/rel_apv_10_7/usr/click/tools/aws/AWSENIManager.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/AWSENIManager.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/AWSENIManager.py	(working copy)
@@ -4,7 +4,7 @@
 from aws_eni.AWSENIController import AWSENIController
 from aws_eni.AWSENIConfigurator import AWSENIConfigurator
 from aws_auth.AWSAuthController import AWSAuthController
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class AWSENIManager():
@@ -12,7 +12,6 @@
     This class is used to manually trigger the tasks when the
     failover happens and recover back to the original state.
     """
-    webuiLogger = ProxyWebUILogger()
 
     def __init__(self):
         pass
@@ -21,7 +20,7 @@
     def failover_happen(cls):
         if not AWSAuthController.is_authenticated():
             ProxyAWSLogger.error("Invalid credential")
-            cls.webuiLogger.debug("Please check the credentials before failover")
+            webuiLogger.debug("Please check the credentials before failover")
             return
         # get eni config
         eni_config = AWSENIConfigurator.get_config()
@@ -36,16 +35,16 @@
                     eni_config[key]["src_eni_id"], eni_config[key]["dest_eni_id"])
             except Exception as e:
                 ProxyAWSLogger.error(str(e))
-                cls.webuiLogger.debug(f"Failover has failed. The reason is: {str(e)}")
+                webuiLogger.debug(f"Failover has failed. The reason is: {str(e)}")
                 is_failed = True
         if not is_failed:
-            cls.webuiLogger.debug("Failover is successful") # All ip is handled
+            webuiLogger.debug("Failover is successful") # All ip is handled
 
     @classmethod
     def failover_recover(cls):
         if not AWSAuthController.is_authenticated():
             ProxyAWSLogger.error("Invalid credential")
-            cls.webuiLogger.debug("Please check the credentials before recover")
+            webuiLogger.debug("Please check the credentials before recover")
             return
         # get eni config
         eni_config = AWSENIConfigurator.get_config()
@@ -60,10 +59,10 @@
                     eni_config[key]["dest_eni_id"], eni_config[key]["src_eni_id"])
             except Exception as e:
                 ProxyAWSLogger.error(str(e))
-                cls.webuiLogger.debug(f"Recover has failed. The reason is: {str(e)}")
+                webuiLogger.debug(f"Recover has failed. The reason is: {str(e)}")
                 is_failed = True
         if not is_failed:
-            cls.webuiLogger.debug("Recover is successful") # All ip is handled
+            webuiLogger.debug("Recover is successful") # All ip is handled
 
 
 if __name__ == '__main__':
Index: /branches/rel_apv_10_7/usr/click/tools/aws/AWSFailoverPoller.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/AWSFailoverPoller.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/AWSFailoverPoller.py	(working copy)
@@ -9,14 +9,12 @@
 from apv_controller.APVController import APVController
 from aws_eni.AWSENIConfigurator import AWSENIConfigurator
 from AWSENIManager import AWSENIManager
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class AWSFailoverPoller():
     """Handles failover polling for AWS infrastructure."""
 
-    webuiLogger = ProxyWebUILogger()
-
     def __init__(self):
         pass
 
@@ -38,16 +36,16 @@
             if apv_c.is_primary():
                 ProxyAWSLogger.debug(
                     f"This APV [{apv_c.get_apv_name()}] is primary APV in HA. Stop pooling.")
-                cls.webuiLogger.debug(
+                webuiLogger.debug(
                     f"Cannot enable the ENI. The reason is: this APV [{apv_c.get_apv_name()}] is primary APV in HA")
                 return
         except Exception as e:
-            cls.webuiLogger.debug(f"Cannot enable the ENI. The reason is: {str(e)}")
+            webuiLogger.debug(f"Cannot enable the ENI. The reason is: {str(e)}")
             return
         ProxyAWSLogger.debug(
             f"This APV [{apv_c.get_apv_name()}] is secondary APV in HA.")
         ProxyAWSLogger.info(f'APV [{apv_c.get_apv_name()}] start polling')
-        cls.webuiLogger.debug("Enable the ENI is successful")
+        webuiLogger.debug("Enable the ENI is successful")
         # pooling
         while True:
             time.sleep(polling_period)
@@ -80,7 +78,7 @@
                     # reset
                     in_failover = False
             except Exception as e:
-                cls.webuiLogger.debug(f"Pooling for ENI has failed. The reason is: {str(e)}")
+                webuiLogger.debug(f"Pooling for ENI has failed. The reason is: {str(e)}")
 
     @classmethod
     def stop(cls) -> None:
@@ -89,7 +87,7 @@
         # get this module name (filename)
         module_name = os.path.basename(__file__)
         cls.kill_poller(module_name)
-        cls.webuiLogger.debug("Disable the ENI is successful")
+        webuiLogger.debug("Disable the ENI is successful")
 
     @classmethod
     def kill_poller(cls, process_name) -> None:
Index: /branches/rel_apv_10_7/usr/click/tools/aws/LoggerManager.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/LoggerManager.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/LoggerManager.py	(working copy)
@@ -1,14 +1,13 @@
 import argparse
 
 from logger.ProxyAWSLogger import ProxyAWSLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
 from webui_logger.WebUILogger import ConfigConst
 import datetime
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class LoggerManager():
     """Manages logging functionality using ProxyAWSLogger."""
-    webuiLogger = ProxyWebUILogger()
 
 
     def __init__():
@@ -56,7 +55,7 @@
     @classmethod
     def get_webui_log(cls, number_of_line: int = None) -> None:
         """Retrieves webui log messages."""
-        log_list = cls.webuiLogger.get_log_list()
+        log_list = webuiLogger.get_log_list()
         logs_with_date = []
         current_log_entry = []
         current_timestamp = None
@@ -84,7 +83,7 @@
 
     @classmethod
     def get_webui_log_file_path(cls) -> str:
-        log_file_path = cls.webuiLogger.get_log_file_path()
+        log_file_path = webuiLogger.get_log_file_path()
         return log_file_path
 
 if __name__ == '__main__':
Index: /branches/rel_apv_10_7/usr/click/tools/aws/aws_auth/AWSAuthController.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/aws_auth/AWSAuthController.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/aws_auth/AWSAuthController.py	(working copy)
@@ -4,7 +4,7 @@
 from botocore.exceptions import NoCredentialsError
 
 from logger.ProxyAWSLogger import ProxyAWSLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class AWSAuthController():
@@ -15,7 +15,6 @@
         output_format(str): The output format is default to json.
     """
     output_format = 'json'
-    webuiLogger = ProxyWebUILogger()
 
     def __init__() -> None:
         pass
@@ -43,10 +42,10 @@
                 capture_output=True,
                 check=True,
             )
-            cls.webuiLogger.debug("Login is successful")
+            webuiLogger.debug("Login is successful")
         except Exception as e:
             ProxyAWSLogger.error(str(e))
-            cls.webuiLogger.debug(f"Login has failed. The reason is: {str(e)}")
+            webuiLogger.debug(f"Login has failed. The reason is: {str(e)}")
 
     @classmethod
     def logout(cls) -> None:
@@ -73,10 +72,10 @@
                 check=True
             )
             print("AWS credentials have been cleared.")
-            cls.webuiLogger.debug("Logout is successful")
+            webuiLogger.debug("Logout is successful")
         except subprocess.CalledProcessError as e:
             ProxyAWSLogger.error(f"Error clearing AWS credentials: {e}")
-            cls.webuiLogger.debug(f"Logout has failed. The reason is: {str(e)}")
+            webuiLogger.debug(f"Logout has failed. The reason is: {str(e)}")
 
     @classmethod
     def get_login_info(cls) -> dict:
Index: /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/WebUILogger.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/WebUILogger.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/WebUILogger.py	(working copy)
@@ -62,7 +62,10 @@
         file_formatter = logging.Formatter(log_format, datefmt=self.config[ConfigConst.DATE_FORMAT_PARAM])
         file_handler.setFormatter(file_formatter)
 
+        if not is_reload and self.logger.handlers:
+            return
         self.logger.addHandler(file_handler)
+        self.logger.propagate = False
 
     def debug(self, message:str) -> None:
         self.logger.debug(message)
Index: /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/webui_logger_singleton.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/webui_logger_singleton.py	(revision 0)
+++ /branches/rel_apv_10_7/usr/click/tools/aws/webui_logger/webui_logger_singleton.py	(working copy)
@@ -0,0 +1,2 @@
+from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+webuiLogger = ProxyWebUILogger()
\ No newline at end of file
Index: /branches/rel_apv_10_7/usr/click/tools/azure/AZFailoverManager.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/AZFailoverManager.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/AZFailoverManager.py	(working copy)
@@ -3,10 +3,9 @@
 import os
 
 from az_nic.NICController import NICController
-from az_route_table.RouteTableFailoverManager import RouteTableFailoverManager
 from ConfigManager import IPConfigManager
 from logger.ProxyAZLogger import ProxyAZLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class AZFailoverManager():
@@ -22,7 +21,7 @@
         # self.from_ip_config_name = ip_config_setting['from_ip_config_name']
         self.to_nic_name = ip_config_setting['to_nic_name']
         # self.to_ip_config_name = ip_config_setting['to_ip_config_name']
-        self.webuiLogger = ProxyWebUILogger()
+        self.webuiLogger = webuiLogger
     def failover_happen(self):
         '''transfer ip config.'''
         ProxyAZLogger.info("start to transfer all IPs")
@@ -60,7 +59,6 @@
         ip_config_manager = IPConfigManager(setting_file_location)
         ip_config_setting_json = ip_config_manager.get_ip_config()
         if not ip_config_setting_json:
-            webuiLogger = ProxyWebUILogger()
             operation = "recover" if args.mode=='2' else "failover"
             webuiLogger.debug(f"Please add NIC before {operation}")
         for i in ip_config_setting_json:
Index: /branches/rel_apv_10_7/usr/click/tools/azure/LoggerManager.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/LoggerManager.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/LoggerManager.py	(working copy)
@@ -1,13 +1,12 @@
 import argparse
 
 from logger.ProxyAZLogger import ProxyAZLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
 from webui_logger.WebUILogger import ConfigConst
 import datetime
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class LoggerManager():
-    webuiLogger = ProxyWebUILogger()
 
     def __init__():
         pass
@@ -61,7 +60,7 @@
     @classmethod
     def get_webui_log(cls, number_of_line: int = None) -> None:
         """Retrieves webui log messages."""
-        log_list = cls.webuiLogger.get_log_list()
+        log_list = webuiLogger.get_log_list()
         logs_with_date = []
         current_log_entry = []
         current_timestamp = None
@@ -89,7 +88,7 @@
 
     @classmethod
     def get_webui_log_file_path(cls) -> str:
-        log_file_path = cls.webuiLogger.get_log_file_path()
+        log_file_path = webuiLogger.get_log_file_path()
         return log_file_path
 
 if __name__=='__main__':
Index: /branches/rel_apv_10_7/usr/click/tools/azure/UDRPoller.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/UDRPoller.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/UDRPoller.py	(working copy)
@@ -7,14 +7,14 @@
 from az_route_table.RouteTableController import RouteTableController
 from RouteConfigManager import RouteConfigManager
 from logger.ProxyAZLogger import ProxyAZLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class UDRPoller():
     def __init__(self, setting_file_location:str) -> None:
         self.setting_file_location = setting_file_location
         self.reload_route_table_config_setting_json()
-        self.webuiLogger = ProxyWebUILogger()
+        self.webuiLogger = webuiLogger
 
     def reload_route_table_config_setting_json(self):
         route_config_manager = RouteConfigManager(self.setting_file_location)
Index: /branches/rel_apv_10_7/usr/click/tools/azure/apv_controller/APVController.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/apv_controller/APVController.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/apv_controller/APVController.py	(working copy)
@@ -5,7 +5,7 @@
 
 from logger.ProxyAZLogger import ProxyAZLogger
 from apv_controller.APVCommander import APVCommander
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 
 class APVController():
@@ -68,7 +68,6 @@
         if not group_priority_list:
             error_msg = "Error: cannot find APV group priority in " + context
             ProxyAZLogger.error(error_msg)
-            webuiLogger = ProxyWebUILogger()
             webuiLogger.debug(f"APV has failed, the reason is: {context}")
             exit(1)
 
Index: /branches/rel_apv_10_7/usr/click/tools/azure/az_auth/AZAuthController.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/az_auth/AZAuthController.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/az_auth/AZAuthController.py	(working copy)
@@ -5,7 +5,7 @@
 import re
 
 from logger.AZLogger import AZLogger
-from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+from webui_logger.webui_logger_singleton import webuiLogger
 
 class AZAuthController():
     def __init__(self) -> None:
@@ -62,7 +62,6 @@
         command = ["az", "logout"]
         # print("Execute command ", " ".join(command))
         result = subprocess.run(command, stdout=sys.stdout, stderr=sys.stderr)
-        webuiLogger = ProxyWebUILogger()
         if result.returncode==0:
             print("Successfully signed out of the Azure account.")
             webuiLogger.debug("Logout is successful")
Index: /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/WebUILogger.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/WebUILogger.py	(revision 39422)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/WebUILogger.py	(working copy)
@@ -62,7 +62,10 @@
         file_formatter = logging.Formatter(log_format, datefmt=self.config[ConfigConst.DATE_FORMAT_PARAM])
         file_handler.setFormatter(file_formatter)
 
+        if not is_reload and self.logger.handlers:
+            return
         self.logger.addHandler(file_handler)
+        self.logger.propagate = False
 
     def debug(self, message:str) -> None:
         self.logger.debug(message)
Index: /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/webui_logger_singleton.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/webui_logger_singleton.py	(revision 0)
+++ /branches/rel_apv_10_7/usr/click/tools/azure/webui_logger/webui_logger_singleton.py	(working copy)
@@ -0,0 +1,2 @@
+from webui_logger.ProxyWebUILogger import ProxyWebUILogger
+webuiLogger = ProxyWebUILogger()
\ No newline at end of file
