Guest User

Untitled

a guest
Oct 17th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import boto3
  4. from datetime import datetime
  5. import logging
  6. import socket
  7. from time import time, sleep
  8.  
  9.  
  10. logger = logging.getLogger(__name__)
  11.  
  12.  
  13. log_format = '%(asctime)s %(name)s %(levelname)5s: %(message)s'
  14.  
  15.  
  16. def main():
  17. from logging import DEBUG, INFO, Formatter
  18. logging.getLogger('').setLevel(DEBUG)
  19. logging.getLogger('botocore').setLevel(INFO)
  20.  
  21. sh = logging.StreamHandler()
  22. sh.setFormatter(Formatter(log_format))
  23. sh.setLevel(DEBUG)
  24. logging.getLogger('').addHandler(sh)
  25.  
  26. ah = AWSHandler()
  27. ah.setFormatter(Formatter(log_format))
  28. ah.setLevel(DEBUG)
  29. logging.getLogger('').addHandler(ah)
  30.  
  31. try:
  32. for i in range(1000):
  33. logger.debug('debug %s', i)
  34. logger.info('info %s', i)
  35. if i % 20 == 0:
  36. ah.flush()
  37. sleep(.3)
  38.  
  39. finally:
  40. ah.flush()
  41.  
  42.  
  43. class AWSHandler (logging.Handler):
  44.  
  45. def __init__(self, session=None, logs_region=None, s3_region=None):
  46. super().__init__()
  47. session = session or boto3
  48. self.logs_client = session.client('logs', region_name=logs_region or 'eu-central-1')
  49. self.s3_client = session.client('s3', region_name=s3_region or 'eu-west-1')
  50. self.stream_name = '{date}-{host}'.format(
  51. date=datetime.utcnow().strftime('%Y%m%dT%H%M%SZ'),
  52. host=socket.getfqdn())
  53. self.logs_client.create_log_stream(
  54. logGroupName='demo',
  55. logStreamName=self.stream_name)
  56. self.seq_token = None
  57. self.recursion_guard = False
  58. self.archive_content = b''
  59. self.messages_to_flush = []
  60.  
  61. def emit(self, record):
  62. if self.recursion_guard:
  63. return
  64. self.recursion_guard = True
  65. try:
  66. msg = self.format(record)
  67. self.messages_to_flush.append(msg)
  68. r = self.logs_client.put_log_events(
  69. logGroupName='demo',
  70. logStreamName=self.stream_name,
  71. logEvents=[
  72. {
  73. 'timestamp': int(time() * 1000),
  74. 'message': str(msg),
  75. },
  76. ],
  77. # sequenceToken cannot be None, it must be really missing for the first message...
  78. **({'sequenceToken': self.seq_token} if self.seq_token else {}))
  79. if r.get('rejectedLogEventsInfo'):
  80. raise Exception('Rejected: {!r}'.format(r))
  81. self.seq_token = r['nextSequenceToken']
  82. finally:
  83. self.recursion_guard = False
  84.  
  85. def flush(self):
  86. if not self.messages_to_flush:
  87. return
  88. self.recursion_guard = True
  89. try:
  90. data = self.archive_content
  91. data += ''.join(msg + '\n' for msg in self.messages_to_flush).encode()
  92. self.s3_client.put_object(
  93. #ACL='private',
  94. ACL='public-read',
  95. Body=data,
  96. Bucket='example-bucket',
  97. ContentType='text/plain',
  98. Key='test/{name}.log'.format(name=self.stream_name),
  99. StorageClass='STANDARD_IA',
  100. )
  101. self.archive_content = data
  102. self.messages_to_flush = []
  103. finally:
  104. self.recursion_guard = False
  105.  
  106.  
  107. if __name__ == '__main__':
  108. main()
Add Comment
Please, Sign In to add comment