Uno-Dan

Logging server demo

Apr 23rd, 2019
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.51 KB | None | 0 0
  1.  
  2. import logging
  3.  
  4. from os import path
  5. from sys import stdout
  6.  
  7. from multiprocessing import Process
  8.  
  9. from zmq import Context
  10. from zmq.backend.cython.constants import SUB, SUBSCRIBE, PUSH, PULL
  11.  
  12. PATH_ABS = path.dirname(path.realpath(__file__))
  13. PATH_LOGS = path.join(PATH_ABS, 'logs')
  14.  
  15. NBR_WORKERS = 5
  16.  
  17. FRONTEND_PORT = '17770'
  18. FRONTEND_SERVER = '127.0.0.1'
  19.  
  20. BACKEND_PORT = '17771'
  21. BACKEND_SERVER = '127.0.0.2'
  22.  
  23.  
  24. class Logger:
  25.     def __init__(self):
  26.         super().__init__()
  27.         self.ctx = \
  28.             self.backend = \
  29.             self.frontend = None
  30.         self.processes = []
  31.  
  32.         formatter = logging.Formatter(
  33.             '%(levelname)s:%(asctime)s:%(message)s',
  34.             datefmt='%Y/%m/%d %I-%M-%S %p'
  35.         )
  36.  
  37.         lg = self.logger = logging.getLogger()
  38.         lg.setLevel(logging.DEBUG)
  39.  
  40.         fh = logging.FileHandler(path.join(PATH_LOGS, 'logfile.log'))
  41.         fh.setFormatter(formatter)
  42.         lg.addHandler(fh)
  43.  
  44.         sdt = logging.StreamHandler(stdout)
  45.         sdt.setFormatter(formatter)
  46.         lg.addHandler(sdt)
  47.  
  48.         lg.info('Logging service started')
  49.  
  50.     def start(self, nbr_workers):
  51.         ctx = Context()
  52.  
  53.         self.frontend = ctx.socket(SUB)
  54.         self.frontend.setsockopt_string(SUBSCRIBE, '')
  55.         self.frontend.bind(f'tcp://{FRONTEND_SERVER}:{FRONTEND_PORT}')
  56.  
  57.         # Workers connect to the backend
  58.         self.backend = ctx.socket(PUSH)
  59.         self.backend.bind(f'tcp://{BACKEND_SERVER}:{BACKEND_PORT}')
  60.  
  61.         for idx in range(nbr_workers):
  62.             self.spawn(self.worker, idx)
  63.  
  64.         while True:
  65.             request = self.frontend.recv_multipart()
  66.             self.backend.send_multipart(request)
  67.  
  68.     # Start daemon worker tasks
  69.     def spawn(self, task, *args):
  70.         process = Process(target=task, args=args)
  71.         self.processes.append(process)
  72.         process.daemon = True
  73.         process.start()
  74.  
  75.     def worker(self, index):
  76.         socket = Context().socket(PULL)
  77.         socket.connect(f'tcp://{BACKEND_SERVER}:{BACKEND_PORT}')
  78.  
  79.         identity = f'LogSlave-{index}'
  80.         socket.identity = identity.encode('utf-8')
  81.         self.logger.log(logging.INFO, f'{identity} started')
  82.  
  83.         while True:
  84.             errorlevel, message = socket.recv_multipart()
  85.             message = message.decode('utf-8').rstrip('\n')
  86.             errorlevel = errorlevel.decode('utf-8')
  87.             self.logger.log(getattr(logging, errorlevel), message)
  88.  
  89.  
  90. logger = Logger()
  91. logger.start(NBR_WORKERS)
Advertisement
Add Comment
Please, Sign In to add comment