+import logging\r
+\r
+class LogAgent(threading.Thread):\r
+ def __init__(self,log_q,log_level,log_file=None):\r
+ super(LogAgent,self).__init__()\r
+ self.log_q = log_q\r
+ self.log_level = log_level\r
+ self.log_file = log_file\r
+ def InitLogger(self):\r
+ # For DEBUG level (All DEBUG_0~9 are applicable)\r
+ self._DebugLogger_agent = logging.getLogger("tool_debug_agent")\r
+ _DebugFormatter = logging.Formatter("[%(asctime)s.%(msecs)d]: %(message)s", datefmt="%H:%M:%S")\r
+ self._DebugLogger_agent.setLevel(self.log_level)\r
+ _DebugChannel = logging.StreamHandler(sys.stdout)\r
+ _DebugChannel.setFormatter(_DebugFormatter)\r
+ self._DebugLogger_agent.addHandler(_DebugChannel)\r
+\r
+ # For VERBOSE, INFO, WARN level\r
+ self._InfoLogger_agent = logging.getLogger("tool_info_agent")\r
+ _InfoFormatter = logging.Formatter("%(message)s")\r
+ self._InfoLogger_agent.setLevel(self.log_level)\r
+ _InfoChannel = logging.StreamHandler(sys.stdout)\r
+ _InfoChannel.setFormatter(_InfoFormatter)\r
+ self._InfoLogger_agent.addHandler(_InfoChannel)\r
+\r
+ # For ERROR level\r
+ self._ErrorLogger_agent = logging.getLogger("tool_error_agent")\r
+ _ErrorFormatter = logging.Formatter("%(message)s")\r
+ self._ErrorLogger_agent.setLevel(self.log_level)\r
+ _ErrorCh = logging.StreamHandler(sys.stderr)\r
+ _ErrorCh.setFormatter(_ErrorFormatter)\r
+ self._ErrorLogger_agent.addHandler(_ErrorCh)\r
+\r
+ if self.log_file:\r
+ if os.path.exists(self.log_file):\r
+ os.remove(self.log_file)\r
+ _Ch = logging.FileHandler(self.log_file)\r
+ _Ch.setFormatter(_DebugFormatter)\r
+ self._DebugLogger_agent.addHandler(_Ch)\r
+\r
+ _Ch= logging.FileHandler(self.log_file)\r
+ _Ch.setFormatter(_InfoFormatter)\r
+ self._InfoLogger_agent.addHandler(_Ch)\r
+\r
+ _Ch = logging.FileHandler(self.log_file)\r
+ _Ch.setFormatter(_ErrorFormatter)\r
+ self._ErrorLogger_agent.addHandler(_Ch)\r
+\r
+ def run(self):\r
+ self.InitLogger()\r
+ while True:\r
+ log_message = self.log_q.get()\r
+ if log_message is None:\r
+ break\r
+ if log_message.name == "tool_error":\r
+ self._ErrorLogger_agent.log(log_message.levelno,log_message.getMessage())\r
+ elif log_message.name == "tool_info":\r
+ self._InfoLogger_agent.log(log_message.levelno,log_message.getMessage())\r
+ elif log_message.name == "tool_debug":\r
+ self._DebugLogger_agent.log(log_message.levelno,log_message.getMessage())\r
+ else:\r
+ self._InfoLogger_agent.log(log_message.levelno,log_message.getMessage())\r
+\r
+ def kill(self):\r
+ self.log_q.put(None)\r