|
| 1 | +import boto3 |
| 2 | +import logging |
| 3 | +import datetime |
| 4 | + |
| 5 | +class Container: |
| 6 | + def __init__(self, taskId, config, definition): |
| 7 | + self.taskId = taskId |
| 8 | + self.config = config |
| 9 | + self.definition = definition |
| 10 | + self.name = config['name'] |
| 11 | + self.startTime = None |
| 12 | + self.logger = logging.getLogger("Container") |
| 13 | + |
| 14 | + def get_log_events(self): |
| 15 | + logConfig = self.definition['logConfiguration'] |
| 16 | + tasklogger = logging.getLogger(self.name) |
| 17 | + |
| 18 | + logs = boto3.client('logs') |
| 19 | + |
| 20 | + logStreamName = '%s/%s/%s' % ( |
| 21 | + logConfig['options']['awslogs-stream-prefix'], |
| 22 | + self.name, |
| 23 | + self.taskId |
| 24 | + ) |
| 25 | + nextToken = False |
| 26 | + while True: |
| 27 | + a = { |
| 28 | + 'logGroupName': logConfig['options']['awslogs-group'], |
| 29 | + 'logStreamName': logStreamName, |
| 30 | + 'startFromHead': True, |
| 31 | + 'limit': 2 |
| 32 | + } |
| 33 | + |
| 34 | + if nextToken: |
| 35 | + a['nextToken'] = nextToken |
| 36 | + else: |
| 37 | + if self.startTime: |
| 38 | + a['startTime'] = self.startTime |
| 39 | + |
| 40 | + try: |
| 41 | + response = logs.get_log_events(**a) |
| 42 | + except Exception as e: |
| 43 | + # todo not sure why i cannot check for the class directly |
| 44 | + if e.__class__.__name__ == 'ResourceNotFoundException': |
| 45 | + self.logger.warn(e) |
| 46 | + return |
| 47 | + raise e |
| 48 | + for event in response['events']: |
| 49 | + yield "[%s] %s" % ( |
| 50 | + datetime.datetime.fromtimestamp( |
| 51 | + event['timestamp']/1000 |
| 52 | + ), |
| 53 | + event['message']) |
| 54 | + self.startTime = event['timestamp']+1 |
| 55 | + |
| 56 | + if len(response['events']) != a['limit']: |
| 57 | + self.logger.debug("[EOS]") |
| 58 | + break |
| 59 | + |
| 60 | + nextToken = response['nextForwardToken'] |
| 61 | + |
0 commit comments