Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import logging
- from os import path
- from sys import stdout
- from multiprocessing import Process
- from zmq import Context
- from zmq.backend.cython.constants import SUB, SUBSCRIBE, PUSH, PULL
- PATH_ABS = path.dirname(path.realpath(__file__))
- PATH_LOGS = path.join(PATH_ABS, 'logs')
- NBR_WORKERS = 5
- FRONTEND_PORT = '17770'
- FRONTEND_SERVER = '127.0.0.1'
- BACKEND_PORT = '17771'
- BACKEND_SERVER = '127.0.0.2'
- class Logger:
- def __init__(self):
- super().__init__()
- self.ctx = \
- self.backend = \
- self.frontend = None
- self.processes = []
- formatter = logging.Formatter(
- '%(levelname)s:%(asctime)s:%(message)s',
- datefmt='%Y/%m/%d %I-%M-%S %p'
- )
- lg = self.logger = logging.getLogger()
- lg.setLevel(logging.DEBUG)
- fh = logging.FileHandler(path.join(PATH_LOGS, 'logfile.log'))
- fh.setFormatter(formatter)
- lg.addHandler(fh)
- sdt = logging.StreamHandler(stdout)
- sdt.setFormatter(formatter)
- lg.addHandler(sdt)
- lg.info('Logging service started')
- def start(self, nbr_workers):
- ctx = Context()
- self.frontend = ctx.socket(SUB)
- self.frontend.setsockopt_string(SUBSCRIBE, '')
- self.frontend.bind(f'tcp://{FRONTEND_SERVER}:{FRONTEND_PORT}')
- # Workers connect to the backend
- self.backend = ctx.socket(PUSH)
- self.backend.bind(f'tcp://{BACKEND_SERVER}:{BACKEND_PORT}')
- for idx in range(nbr_workers):
- self.spawn(self.worker, idx)
- while True:
- request = self.frontend.recv_multipart()
- self.backend.send_multipart(request)
- # Start daemon worker tasks
- def spawn(self, task, *args):
- process = Process(target=task, args=args)
- self.processes.append(process)
- process.daemon = True
- process.start()
- def worker(self, index):
- socket = Context().socket(PULL)
- socket.connect(f'tcp://{BACKEND_SERVER}:{BACKEND_PORT}')
- identity = f'LogSlave-{index}'
- socket.identity = identity.encode('utf-8')
- self.logger.log(logging.INFO, f'{identity} started')
- while True:
- errorlevel, message = socket.recv_multipart()
- message = message.decode('utf-8').rstrip('\n')
- errorlevel = errorlevel.decode('utf-8')
- self.logger.log(getattr(logging, errorlevel), message)
- logger = Logger()
- logger.start(NBR_WORKERS)
Advertisement
Add Comment
Please, Sign In to add comment