Beispiel #1
0
    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))
Beispiel #2
0
    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)
Beispiel #3
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)
Beispiel #4
0
    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")
Beispiel #5
0
    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)
Beispiel #6
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
Beispiel #7
0
    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)
Beispiel #8
0
    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