Logging handler to send logs to your OpenSearch cluster with bulk SSL. Forked from https://github.com/logzio/logzio-python-handler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
5.0 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. import fnmatch
  2. import logging.config
  3. import os
  4. import time
  5. from unittest import TestCase
  6. from .mockLogzioListener import listener
  7. def _find(pattern, path):
  8. result = []
  9. for root, dirs, files in os.walk(path):
  10. for name in files:
  11. if fnmatch.fnmatch(name, pattern):
  12. result.append(os.path.join(root, name))
  13. break # Not descending recursively
  14. return result
  15. class TestLogzioSender(TestCase):
  16. def setUp(self):
  17. self.logzio_listener = listener.MockLogzioListener()
  18. self.logzio_listener.clear_logs_buffer()
  19. self.logzio_listener.clear_server_error()
  20. self.logs_drain_timeout = 1
  21. self.retries_no = 4
  22. self.retry_timeout = 2
  23. logging_configuration = {
  24. "version": 1,
  25. "formatters": {
  26. "logzio": {
  27. "format": '{"key": "value"}',
  28. "validate": False
  29. }
  30. },
  31. "handlers": {
  32. "LogzioHandler": {
  33. "class": "logzio.handler.LogzioHandler",
  34. "formatter": "logzio",
  35. "level": "DEBUG",
  36. "token": "token",
  37. 'logzio_type': "type",
  38. 'logs_drain_timeout': self.logs_drain_timeout,
  39. 'url': "http://" + self.logzio_listener.get_host() + ":" + str(self.logzio_listener.get_port()),
  40. 'debug': True,
  41. 'retries_no': self.retries_no,
  42. 'retry_timeout': self.retry_timeout
  43. }
  44. },
  45. "loggers": {
  46. "test": {
  47. "handlers": ["LogzioHandler"],
  48. "level": "DEBUG"
  49. }
  50. }
  51. }
  52. logging.config.dictConfig(logging_configuration)
  53. self.logger = logging.getLogger('test')
  54. for curr_file in _find("logzio-failures-*.txt", "."):
  55. os.remove(curr_file)
  56. def test_simple_log_drain(self):
  57. log_message = "Test simple log drain"
  58. self.logger.info(log_message)
  59. time.sleep(self.logs_drain_timeout * 2)
  60. self.assertTrue(self.logzio_listener.find_log(log_message))
  61. def test_multiple_lines_drain(self):
  62. logs_num = 50
  63. for counter in range(0, logs_num):
  64. self.logger.info("Test " + str(counter))
  65. time.sleep(self.logs_drain_timeout * 2)
  66. for counter in range(0, logs_num):
  67. self.logger.info("Test " + str(counter))
  68. time.sleep(self.logs_drain_timeout * 2)
  69. self.assertEqual(self.logzio_listener.get_number_of_logs(), logs_num * 2)
  70. def test_server_failure(self):
  71. log_message = "Failing log message"
  72. self.logzio_listener.set_server_error()
  73. self.logger.info(log_message)
  74. time.sleep(self.logs_drain_timeout * 2)
  75. self.assertFalse(self.logzio_listener.find_log(log_message))
  76. self.logzio_listener.clear_server_error()
  77. time.sleep(self.logs_drain_timeout * self.retry_timeout * self.retries_no) # Longer, because of the retry
  78. self.assertTrue(self.logzio_listener.find_log(log_message))
  79. def test_local_file_backup(self):
  80. log_message = "Backup to local filesystem"
  81. self.logzio_listener.set_server_error()
  82. self.logger.info(log_message)
  83. # Make sure no file is present
  84. self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
  85. time.sleep(self.retries_no*self.retry_timeout*2*2) # All of the retries
  86. failure_files = _find("logzio-failures-*.txt", ".")
  87. self.assertEqual(len(failure_files), 1)
  88. with open(failure_files[0], "r") as f:
  89. line = f.readline()
  90. self.assertTrue(log_message in line)
  91. def test_local_file_backup_disabled(self):
  92. log_message = "Backup to local filesystem"
  93. self.logzio_listener.set_server_error()
  94. self.logger.handlers[0].logzio_sender.backup_logs = False
  95. self.logger.info(log_message)
  96. # Make sure no file is present
  97. self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
  98. time.sleep(self.retries_no*self.retry_timeout) # All of the retries
  99. # Make sure no file was created
  100. self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
  101. def test_can_send_after_fork(self):
  102. childpid = os.fork()
  103. child_log_message = 'logged from child process'
  104. parent_log_message = 'logged from parent process'
  105. if childpid == 0:
  106. # Log from the child process
  107. self.logger.info(child_log_message)
  108. time.sleep(self.logs_drain_timeout * 2)
  109. os._exit(0)
  110. # Wait for the child process to finish
  111. os.waitpid(childpid, 0)
  112. # log from the parent process
  113. self.logger.info(parent_log_message)
  114. time.sleep(self.logs_drain_timeout * 2)
  115. # Ensure listener receive all log messages
  116. self.assertTrue(self.logzio_listener.find_log(child_log_message))
  117. self.assertTrue(self.logzio_listener.find_log(parent_log_message))