diff --git a/.gitignore b/.gitignore index 2f78cf5..6416bf8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pyc +*egg-info/ diff --git a/logzio/sender.py b/logzio/sender.py index 7975f63..eb88a5a 100644 --- a/logzio/sender.py +++ b/logzio/sender.py @@ -34,13 +34,18 @@ class LogzioSender: # Create a queue to hold logs self.queue = queue.Queue() + self._initialize_sending_thread() + def _initialize_sending_thread(self): self.sending_thread = Thread(target=self._drain_queue) self.sending_thread.daemon = False self.sending_thread.name = "logzio-sending-thread" self.sending_thread.start() def append(self, logs_message): + if not self.sending_thread.is_alive(): + self._initialize_sending_thread() + # Queue lib is thread safe, no issue here self.queue.put(json.dumps(logs_message)) diff --git a/tests/mockLogzioListener/listener.py b/tests/mockLogzioListener/listener.py index df97218..213756f 100644 --- a/tests/mockLogzioListener/listener.py +++ b/tests/mockLogzioListener/listener.py @@ -73,7 +73,7 @@ class MockLogzioListener: return len(self.logs_list) def clear_logs_buffer(self): - self.logs_list = [] + self.logs_list[:] = [] def set_server_error(self): self.persistent_flags.set_server_error() diff --git a/tests/test_logzioSender.py b/tests/test_logzioSender.py index 0db4c8e..420688b 100644 --- a/tests/test_logzioSender.py +++ b/tests/test_logzioSender.py @@ -21,6 +21,7 @@ def _find(pattern, path): class TestLogzioSender(TestCase): def setUp(self): self.logzio_listener = listener.MockLogzioListener() + self.logzio_listener.clear_logs_buffer() self.logzio_listener.clear_server_error() self.logs_drain_timeout = 1 @@ -106,3 +107,24 @@ class TestLogzioSender(TestCase): with open(failure_files[0], "r") as f: line = f.readline() self.assertTrue(log_message in line) + + def test_can_send_after_fork(self): + childpid = os.fork() + child_log_message = 'logged from child process' + parent_log_message = 'logged from parent process' + + if childpid == 0: + # Log from the child process + self.logger.info(child_log_message) + time.sleep(self.logs_drain_timeout * 2) + os._exit(0) + # Wait for the child process to finish + os.waitpid(childpid, 0) + + # log from the parent process + self.logger.info(parent_log_message) + time.sleep(self.logs_drain_timeout * 2) + + # Ensure listener receive all log messages + self.assertTrue(self.logzio_listener.find_log(child_log_message)) + self.assertTrue(self.logzio_listener.find_log(parent_log_message))