log_printer.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import sys
  2. from itertools import cycle
  3. from ..service import get_container_name
  4. from .multiplexer import Multiplexer
  5. from . import colors
  6. class LogPrinter(object):
  7. def __init__(self, client):
  8. self.client = client
  9. def attach(self, containers):
  10. generators = self._make_log_generators(containers)
  11. mux = Multiplexer(generators)
  12. for line in mux.loop():
  13. sys.stdout.write(line)
  14. def _make_log_generators(self, containers):
  15. color_fns = cycle(colors.rainbow())
  16. generators = []
  17. for container in containers:
  18. color_fn = color_fns.next()
  19. generators.append(self._make_log_generator(container, color_fn))
  20. return generators
  21. def _make_log_generator(self, container, color_fn):
  22. container_name = get_container_name(container)
  23. format = lambda line: color_fn(container_name + " | ") + line
  24. return (format(line) for line in self._readlines(container))
  25. def _readlines(self, container, logs=False, stream=True):
  26. socket = self.client.attach_socket(
  27. container['Id'],
  28. params={
  29. 'stdin': 0,
  30. 'stdout': 1,
  31. 'stderr': 1,
  32. 'logs': 1 if logs else 0,
  33. 'stream': 1 if stream else 0
  34. },
  35. )
  36. for line in iter(socket.makefile().readline, b''):
  37. if not line.endswith('\n'):
  38. line += '\n'
  39. yield line
  40. socket.close()