def test_syslog(self): """ Test """ # Syslog is enabled by default SolBase.logging_init("INFO", True, log_callback=self._on_log) SolBase.set_compo_name("COMPO_XXX") # Emit a log self.onLogCallCount = 0 logger.info("TEST LOG 888") self.assertEqual(self.onLogCallCount, 1) self.assertIsNotNone(self.lastMessage) self.assertGreaterEqual(self.lastMessage.find("TEST LOG 888"), 0) self.assertGreaterEqual(self.lastMessage.find("COMPO_XXX:"), 0) self.assertGreaterEqual(self.lastMessage.find("| COMPO_XXX |"), 0) self.assertGreaterEqual( self.lastMessage.find(SolBase.get_machine_name() + " |"), 0) logger.info("Received ==> %s", repr(self.lastMessage)) # Emit a log (str) self.onLogCallCount = 0 logger.info(repr(u"BUF\u001B\u0BD9\U0001A10D\u1501FUB")) self.assertEqual(self.onLogCallCount, 1) self.assertIsNotNone(self.lastMessage) self.assertGreaterEqual(self.lastMessage.find("BUF"), 0) self.assertGreaterEqual(self.lastMessage.find("FUB"), 0) self.assertGreaterEqual(self.lastMessage.find("COMPO_XXX:"), 0) self.assertGreaterEqual(self.lastMessage.find("| COMPO_XXX |"), 0) self.assertGreaterEqual( self.lastMessage.find(SolBase.get_machine_name() + " |"), 0) logger.info("Received ==> %s", repr(self.lastMessage))
def test_log_to_file_time_file_seconds(self): """ Test """ log_file = "/tmp/pythonsol_unittest.log" # Clean if FileUtility.is_file_exist(log_file): os.remove(log_file) for f in glob.glob("/tmp/pythonsol_unittest.log.*"): os.remove(f) # Init SolBase.logging_init(log_level="INFO", log_to_file=log_file, log_to_console=True, log_to_syslog=False, log_callback=self._on_log, force_reset=True, log_to_file_mode="time_file_seconds") SolBase.set_compo_name("COMPO_XXX") # Emit a log logger.info("TEST LOG 888") # Emit a log (str) logger.info(u"BUF \u001B\u0BD9\U0001A10D\u1501\xc3 FUB") # Check the file buf = FileUtility.file_to_textbuffer(log_file, "utf-8") self.assertIsNotNone(buf) self.assertGreaterEqual(buf.find("TEST LOG 888"), 0) self.assertGreaterEqual(buf.find("BUF "), 0) self.assertGreaterEqual(buf.find(" FUB"), 0) self.assertGreaterEqual( buf.find(u"BUF \u001B\u0BD9\U0001A10D\u1501\xc3 FUB"), 0) # Wait 5 sec for i in range(0, 10): SolBase.sleep(1100) logger.info("Log i=%s", i) # Emit a log logger.info("TEST LOG 999") # We should have "pythonsol_unittest.log.*" but no more than 7 f_count = 0 for f in glob.glob("/tmp/pythonsol_unittest.log.*"): logger.info("Found %s", f) f_count += 1 self.assertGreater(f_count, 0) self.assertLessEqual(f_count, 7) # Reset SolBase.logging_init("INFO", True)
def setUp(self): """ Setup (called before each test) """ # Initialize asap SolBase.voodoo_init() SolBase.set_compo_name("CompoNotSet") self.assertTrue(SolBase._voodoo_initialized) self.assertTrue(SolBase._logging_initialized)
def test_compo_name(self): """ Test """ self.assertEqual(SolBase.get_compo_name(), "CompoNotSet") SolBase.set_compo_name("toto") self.assertEqual(SolBase.get_compo_name(), "toto") SolBase.set_compo_name("toto2") self.assertEqual(SolBase.get_compo_name(), "toto2")
def test_log_to_file(self): """ Test """ log_file = "/tmp/pythonsol_unittest.log" # Clean if FileUtility.is_file_exist(log_file): os.remove(log_file) # Init SolBase.logging_init(log_level="INFO", log_to_file=log_file, log_to_console=True, log_to_syslog=False, log_callback=self._on_log, force_reset=True) SolBase.set_compo_name("COMPO_XXX") # Emit a log logger.info("TEST LOG 888") # Emit a log (str) logger.info(u"BUF \u001B\u0BD9\U0001A10D\u1501\xc3 FUB") # Check the file buf = FileUtility.file_to_textbuffer(log_file, "utf-8") self.assertIsNotNone(buf) self.assertGreaterEqual(buf.find("TEST LOG 888"), 0) self.assertGreaterEqual(buf.find("BUF "), 0) self.assertGreaterEqual(buf.find(" FUB"), 0) self.assertGreaterEqual( buf.find(u"BUF \u001B\u0BD9\U0001A10D\u1501\xc3 FUB"), 0) # Simulate a log rotate : kick the file and touch it os.remove(log_file) FileUtility.append_text_to_file(log_file, "TOTO\n", "utf-8", overwrite=False) # Re-emit logger.info("TEST LOG 999") buf = FileUtility.file_to_textbuffer(log_file, "utf-8") self.assertIsNotNone(buf) self.assertGreaterEqual(buf.find("TOTO"), 0) self.assertGreaterEqual(buf.find("TEST LOG 999"), 0)
def setUp(self): """ Setup (called before each test) """ # Initialize asap SolBase.voodoo_init() SolBase.set_compo_name("CompoNotSet") self.assertTrue(SolBase._voodoo_initialized) self.assertTrue(SolBase._logging_initialized) # Reset Meters.reset() # Bench self.per_loop = 10000 self.max_ms = 2000
def test_log_to_file_with_filter_greenlet(self): """ Test """ log_file = "/tmp/pythonsol_unittest.log" # Clean if FileUtility.is_file_exist(log_file): os.remove(log_file) # Init SolBase.logging_init(log_level="INFO", log_to_file=log_file, log_to_console=True, log_to_syslog=False, log_callback=self._on_log, force_reset=True) SolBase.set_compo_name("COMPO_XXX") # Go g1 = gevent.spawn(self._run_filter, "ip001") g2 = gevent.spawn(self._run_filter, "ip002") gevent.joinall([g1, g2]) # Re-read and check buf = FileUtility.file_to_textbuffer(log_file, "utf-8") self.assertGreaterEqual(buf.find("TEST LOG ip_addr=ip001"), 0) self.assertGreaterEqual(buf.find("TEST LOG ip_addr=ip002"), 0) # Via regex for r, b in [ ["TEST LOG ip_addr=ip001 | k_ip:ip001 z_value:ip001", True], ["TEST LOG ip_addr=ip002 | k_ip:ip002 z_value:ip002", True], ["TEST LOG ip_addr=ip001 | k_ip:ip002", False], ["TEST LOG ip_addr=ip002 | k_ip:ip001", False], ]: idx = buf.find(r) if b: self.assertLess(0, idx, r) else: self.assertGreaterEqual(0, idx, r)
def _internal_init(self, pidfile, stdin, stdout, stderr, logfile, loglevel, on_start_exit_zero, max_open_files, change_dir, timeout_ms, logtosyslog=True, logtosyslog_facility=SysLogHandler.LOG_LOCAL0, logtoconsole=False, app_name=None): """ Internal init. :param pidfile: Pid file. :type pidfile: str :param change_dir: Enable directory change :type change_dir: bool :param max_open_files: Max open files. :type max_open_files: int :param stdin: stdin. What else? :type stdin: str :param stdout: stdout. What else? :type stdout: str :param stderr: stderr. What else? :type stderr: str :param logfile: logfile. If none or empty, log to files will be disabled. What else? :type logfile: str :param loglevel: loglevel. What else? :type loglevel: str :param on_start_exit_zero: perform an exit(0) on start. :type on_start_exit_zero: bool :param timeout_ms: Timeout in ms :type timeout_ms: int :param logtosyslog: bool,None (default True) :type logtosyslog: bool,None :param logtosyslog_facility: int,None default SysLogHandler.LOG_LOCAL0 :type logtosyslog_facility: int,None :param logtoconsole: bool,None (default False) :type logtoconsole: bool,None :param app_name: Application name (syslog), default None :type app_name: str,None """ # File handle self._stderr_file = None self._stdin_file = None self._stdout_file = None # Store self._pidfile = pidfile self._maxOpenFiles = max_open_files self._timeout_ms = timeout_ms self._stdin = stdin self._stdout = stdout self._stderr = stderr self._loglevel = loglevel self._changeDir = change_dir self._onStartExitZero = on_start_exit_zero # Engage logfile asap if specified logger.debug("_loglevel=%s", self._loglevel) # App name self.v_app_name = app_name if self.v_app_name: SolBase.set_compo_name(self.v_app_name) # Init : log to console self.v_log_to_console = False if logtoconsole is not None: self.v_log_to_console = logtoconsole # Init : log to file self.v_log_to_file = None if logfile and len(logfile) > 0: self.v_log_to_file = logfile # Init : log to syslog self.v_log_to_syslog = True self.v_log_to_syslog_facility = SysLogHandler.LOG_LOCAL0 if logtosyslog is not None: self.v_log_to_syslog = logtosyslog if logtosyslog_facility is not None: self.v_log_to_syslog_facility = logtosyslog_facility # Log logger.info( "Starting, action=%s, app_name=%s, v_log_to_file=%s, v_log_to_syslog=%s, v_log_to_syslog_facility=%s, v_log_to_console=%s", self.vars.get("action", None) if self.vars else None, self.v_app_name, self.v_log_to_file, self.v_log_to_syslog, self.v_log_to_syslog_facility, self.v_log_to_console) self._logging_reset() # Go logger.debug("_pidfile=%s", self._pidfile) logger.debug("_maxOpenFiles=%s", self._maxOpenFiles) logger.debug("_timeout_ms=%s", self._timeout_ms) logger.debug("_stdin=%s", self._stdin) logger.debug("_stdout=%s", self._stdout) logger.debug("_stderr=%s", self._stderr) logger.debug("_loglevel=%s", self._loglevel) logger.debug("_onStartExitZero=%s", self._onStartExitZero) logger.debug("_changeDir=%s", self._changeDir) logger.info("vars=%s", self.vars) # Check if not pidfile: raise Exception("pidfile is required") # Internal self._pidFileHandle = None self._softLimit = None self._hardLimit = None