mirror of
				https://github.com/thingsboard/thingsboard-gateway
				synced 2025-10-26 22:31:42 +08:00 
			
		
		
		
	Added errors count resetting every 60 sec
This commit is contained in:
		| @@ -111,7 +111,7 @@ class BACnetConnector(Thread, Connector): | |||||||
|     def close(self): |     def close(self): | ||||||
|         self.__stopped = True |         self.__stopped = True | ||||||
|         self.__connected = False |         self.__connected = False | ||||||
|         self._log.reset() |         self._log.stop() | ||||||
|  |  | ||||||
|         self._application.mux.directPort.connected = False |         self._application.mux.directPort.connected = False | ||||||
|         self._application.mux.directPort.accepting = False |         self._application.mux.directPort.accepting = False | ||||||
|   | |||||||
| @@ -106,7 +106,7 @@ class BLEConnector(Connector, Thread): | |||||||
|         self.__devices = [] |         self.__devices = [] | ||||||
|  |  | ||||||
|         self.__log.info('%s has been stopped.', self.get_name()) |         self.__log.info('%s has been stopped.', self.get_name()) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|         return self.name |         return self.name | ||||||
|   | |||||||
| @@ -101,7 +101,7 @@ class CanConnector(Connector, Thread): | |||||||
|         if not self.__stopped: |         if not self.__stopped: | ||||||
|             self.__stopped = True |             self.__stopped = True | ||||||
|             self._log.debug("[%s] Stopping", self.get_name()) |             self._log.debug("[%s] Stopping", self.get_name()) | ||||||
|             self._log.reset() |             self._log.stop() | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|         return self.name |         return self.name | ||||||
|   | |||||||
| @@ -189,7 +189,7 @@ class FTPConnector(Connector, Thread): | |||||||
|     def close(self): |     def close(self): | ||||||
|         self.__stopped = True |         self.__stopped = True | ||||||
|         self.__log.info('FTP Connector stopped.') |         self.__log.info('FTP Connector stopped.') | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|         return self.name |         return self.name | ||||||
|   | |||||||
| @@ -343,7 +343,7 @@ class ModbusConnector(Connector, Thread): | |||||||
|  |  | ||||||
|         # self.__slave_thread.join() |         # self.__slave_thread.join() | ||||||
|         self.__log.info('%s has been stopped.', self.get_name()) |         self.__log.info('%s has been stopped.', self.get_name()) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|         self.__stopping = False |         self.__stopping = False | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|   | |||||||
| @@ -341,7 +341,7 @@ class MqttConnector(Connector, Thread): | |||||||
|         for worker in self.__workers_thread_pool: |         for worker in self.__workers_thread_pool: | ||||||
|             worker.stop() |             worker.stop() | ||||||
|         self.__log.info('%s has been stopped.', self.get_name()) |         self.__log.info('%s has been stopped.', self.get_name()) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|         return self.name |         return self.name | ||||||
|   | |||||||
| @@ -220,7 +220,7 @@ class OcppConnector(Connector, Thread): | |||||||
|         self.__loop.stop() |         self.__loop.stop() | ||||||
|  |  | ||||||
|         self._log.info('%s has been stopped.', self.get_name()) |         self._log.info('%s has been stopped.', self.get_name()) | ||||||
|         self._log.reset() |         self._log.stop() | ||||||
|  |  | ||||||
|     def get_id(self): |     def get_id(self): | ||||||
|         return self.__id |         return self.__id | ||||||
|   | |||||||
| @@ -94,7 +94,7 @@ class OdbcConnector(Connector, Thread): | |||||||
|         if not self.__stopped: |         if not self.__stopped: | ||||||
|             self.__stopped = True |             self.__stopped = True | ||||||
|             self._log.debug("[%s] Stopping", self.get_name()) |             self._log.debug("[%s] Stopping", self.get_name()) | ||||||
|             self._log.reset() |             self._log.stop() | ||||||
|  |  | ||||||
|     def get_id(self): |     def get_id(self): | ||||||
|         return self.__id |         return self.__id | ||||||
|   | |||||||
| @@ -244,7 +244,7 @@ class OpcUaConnector(Thread, Connector): | |||||||
|                 pass |                 pass | ||||||
|         self.__connected = False |         self.__connected = False | ||||||
|         self._log.info('%s has been stopped.', self.get_name()) |         self._log.info('%s has been stopped.', self.get_name()) | ||||||
|         self._log.reset() |         self._log.stop() | ||||||
|  |  | ||||||
|     def get_id(self): |     def get_id(self): | ||||||
|         return self.__id |         return self.__id | ||||||
|   | |||||||
| @@ -104,7 +104,7 @@ class OpcUaConnectorAsyncIO(Connector, Thread): | |||||||
|         self.__stopped = True |         self.__stopped = True | ||||||
|         self.__connected = False |         self.__connected = False | ||||||
|         self.__log.info('%s has been stopped.', self.get_name()) |         self.__log.info('%s has been stopped.', self.get_name()) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     async def __reset_node(self, node): |     async def __reset_node(self, node): | ||||||
|         node['valid'] = False |         node['valid'] = False | ||||||
|   | |||||||
| @@ -322,7 +322,7 @@ class RequestConnector(Connector, Thread): | |||||||
|  |  | ||||||
|     def close(self): |     def close(self): | ||||||
|         self.__stopped = True |         self.__stopped = True | ||||||
|         self._log.reset() |         self._log.stop() | ||||||
|  |  | ||||||
|     def get_config(self): |     def get_config(self): | ||||||
|         return self.__config |         return self.__config | ||||||
|   | |||||||
| @@ -200,7 +200,7 @@ class RESTConnector(Connector, Thread): | |||||||
|         if not self._loop.is_closed(): |         if not self._loop.is_closed(): | ||||||
|             self._loop.call_soon_threadsafe(self._loop.stop) |             self._loop.call_soon_threadsafe(self._loop.stop) | ||||||
|         self.__log.info('REST connector stopped.') |         self.__log.info('REST connector stopped.') | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|         self.join() |         self.join() | ||||||
|  |  | ||||||
|     def get_id(self): |     def get_id(self): | ||||||
|   | |||||||
| @@ -311,7 +311,7 @@ class SocketConnector(Connector, Thread): | |||||||
|                 pass  # Ignore errors when socket is already closed |                 pass  # Ignore errors when socket is already closed | ||||||
|             self.__socket.close() |             self.__socket.close() | ||||||
|             sleep(0.01) |             sleep(0.01) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     def get_name(self): |     def get_name(self): | ||||||
|         return self.name |         return self.name | ||||||
|   | |||||||
| @@ -203,7 +203,7 @@ class XMPPConnector(Connector, Thread): | |||||||
|         self.__stopped = True |         self.__stopped = True | ||||||
|         self._connected = False |         self._connected = False | ||||||
|         self.__log.info('%s has been stopped.', self.get_name()) |         self.__log.info('%s has been stopped.', self.get_name()) | ||||||
|         self.__log.reset() |         self.__log.stop() | ||||||
|  |  | ||||||
|     def get_id(self): |     def get_id(self): | ||||||
|         return self.__id |         return self.__id | ||||||
|   | |||||||
| @@ -159,7 +159,7 @@ class CustomSerialConnector(Thread, Connector):  # Define a connector class, it | |||||||
|             self.__gateway.del_device(self.__devices[device]["device_config"]["name"]) |             self.__gateway.del_device(self.__devices[device]["device_config"]["name"]) | ||||||
|             if self.__devices[device]['serial'].isOpen(): |             if self.__devices[device]['serial'].isOpen(): | ||||||
|                 self.__devices[device]['serial'].close() |                 self.__devices[device]['serial'].close() | ||||||
|         self._log.reset() |         self._log.stop() | ||||||
|  |  | ||||||
|     def on_attributes_update(self, content):  # Function used for processing attribute update requests from ThingsBoard |     def on_attributes_update(self, content):  # Function used for processing attribute update requests from ThingsBoard | ||||||
|         self._log.debug(content) |         self._log.debug(content) | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| #     limitations under the License. | #     limitations under the License. | ||||||
|  |  | ||||||
| import logging | import logging | ||||||
| from time import sleep | from time import sleep, time | ||||||
| from threading import Thread | from threading import Thread | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -51,24 +51,38 @@ def init_logger(gateway, name, level, enable_remote_logging=False): | |||||||
| class TbLogger(logging.Logger): | class TbLogger(logging.Logger): | ||||||
|     ALL_ERRORS_COUNT = 0 |     ALL_ERRORS_COUNT = 0 | ||||||
|     IS_ALL_ERRORS_COUNT_RESET = False |     IS_ALL_ERRORS_COUNT_RESET = False | ||||||
|  |     RESET_ERRORS__PERIOD = 60 | ||||||
|  |  | ||||||
|     def __init__(self, name, gateway=None, level=logging.NOTSET): |     def __init__(self, name, gateway=None, level=logging.NOTSET): | ||||||
|         super(TbLogger, self).__init__(name=name, level=level) |         super(TbLogger, self).__init__(name=name, level=level) | ||||||
|         self.propagate = True |         self.propagate = True | ||||||
|         self.parent = self.root |         self.parent = self.root | ||||||
|         self._gateway = gateway |         self._gateway = gateway | ||||||
|  |         self._stopped = False | ||||||
|         self.errors = 0 |         self.errors = 0 | ||||||
|         self.attr_name = self.name + '_ERRORS_COUNT' |         self.attr_name = self.name + '_ERRORS_COUNT' | ||||||
|         self._is_on_init_state = True |         self._is_on_init_state = True | ||||||
|         if self._gateway: |         if self._gateway: | ||||||
|             self._send_errors_thread = Thread(target=self._send_errors, name='Send Errors Thread', daemon=True) |             self._send_errors_thread = Thread(target=self._send_errors, name='[LOGGER] Send Errors Thread', daemon=True) | ||||||
|             self._send_errors_thread.start() |             self._send_errors_thread.start() | ||||||
|  |  | ||||||
|  |         self._start_time = time() | ||||||
|  |         self._reset_errors_thread = Thread(target=self._reset_errors_timer, name='[LOGGER] Reset Errors Thread', | ||||||
|  |                                            daemon=True) | ||||||
|  |         self._reset_errors_thread.start() | ||||||
|  |  | ||||||
|     def reset(self): |     def reset(self): | ||||||
|         """ |         """ | ||||||
|         !!!Need to be called manually in the connector 'close' method!!! |         !!!Need to be called manually in the connector 'close' method!!! | ||||||
|         """ |         """ | ||||||
|         TbLogger.ALL_ERRORS_COUNT = TbLogger.ALL_ERRORS_COUNT - self.errors |         if TbLogger.ALL_ERRORS_COUNT > 0 and self.errors > 0: | ||||||
|  |             TbLogger.ALL_ERRORS_COUNT = TbLogger.ALL_ERRORS_COUNT - self.errors | ||||||
|  |             self.errors = 0 | ||||||
|  |             self._send_error_count() | ||||||
|  |  | ||||||
|  |     def stop(self): | ||||||
|  |         self.reset() | ||||||
|  |         self._stopped = True | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def gateway(self): |     def gateway(self): | ||||||
| @@ -94,21 +108,32 @@ class TbLogger(logging.Logger): | |||||||
|             TbLogger.IS_ALL_ERRORS_COUNT_RESET = True |             TbLogger.IS_ALL_ERRORS_COUNT_RESET = True | ||||||
|         self._is_on_init_state = False |         self._is_on_init_state = False | ||||||
|  |  | ||||||
|  |     def _reset_errors_timer(self): | ||||||
|  |         while not self._stopped: | ||||||
|  |             if time() - self._start_time >= TbLogger.RESET_ERRORS__PERIOD: | ||||||
|  |                 self.reset() | ||||||
|  |                 self._start_time = time() | ||||||
|  |  | ||||||
|  |             sleep(1) | ||||||
|  |  | ||||||
|     def error(self, msg, *args, **kwargs): |     def error(self, msg, *args, **kwargs): | ||||||
|         kwargs['stacklevel'] = 2 |         kwargs['stacklevel'] = 2 | ||||||
|         super(TbLogger, self).error(msg, *args, **kwargs) |         super(TbLogger, self).error(msg, *args, **kwargs) | ||||||
|  |         self._add_error() | ||||||
|         self._send_error_count() |         self._send_error_count() | ||||||
|  |  | ||||||
|     def exception(self, msg, *args, **kwargs) -> None: |     def exception(self, msg, *args, **kwargs) -> None: | ||||||
|         attr_name = kwargs.pop('attr_name', None) |         attr_name = kwargs.pop('attr_name', None) | ||||||
|         kwargs['stacklevel'] = 2 |         kwargs['stacklevel'] = 2 | ||||||
|         super(TbLogger, self).exception(msg, *args, **kwargs) |         super(TbLogger, self).exception(msg, *args, **kwargs) | ||||||
|  |         self._add_error() | ||||||
|         self._send_error_count(error_attr_name=attr_name) |         self._send_error_count(error_attr_name=attr_name) | ||||||
|  |  | ||||||
|     def _send_error_count(self, error_attr_name=None): |     def _add_error(self): | ||||||
|         TbLogger.ALL_ERRORS_COUNT += 1 |         TbLogger.ALL_ERRORS_COUNT += 1 | ||||||
|         self.errors += 1 |         self.errors += 1 | ||||||
|  |  | ||||||
|  |     def _send_error_count(self, error_attr_name=None): | ||||||
|         while self._is_on_init_state: |         while self._is_on_init_state: | ||||||
|             sleep(.2) |             sleep(.2) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 samson0v
					samson0v