BaseManagerを使用してキューを共有しています。ロギングのためのキューリスト。これはLinux上でうまく動作しますが、次のコードのウィンドウでは「サーバの取得」というメッセージが表示されますが、「サーバに接続された」ログメッセージは表示されません。その間の唯一の行は、BaseManager.get_server()の呼び出しです。どうして?それは修正できますか?BaseManagerのロギングが停止するのはなぜですか?
def server(eventq, logq):
""" publish event queue """
log = logging.getLogger()
log.handlers = [QueueHandler(logq)]
BaseManager.register('get_eventq', callable=lambda: eventq)
m = BaseManager(address=('', config["port"]), authkey=config["authkey"])
log.info("getting server")
try:
s = m.get_server()
except:
log.exception()
log.info("got server")
s.serve_forever()
def listener(eventq, logq):
""" listener for event queue """
log = logging.getLogger()
log.handlers = [QueueHandler(logq)]
log.info("starting listener")
while True:
p = Process(target=callback, args=(eventq.get(),))
p.start()
def main():
""" setup queue and listen for events
"""
# logging queue
log = logging.getLogger()
logq = Queue()
l = QueueListener(logq, *log.handlers)
l.start()
log.handlers = [QueueHandler(logq)]
# server for event queue
eventq = Queue()
p = Process(target=server, args=(eventq, logq))
p.start()
# listener
log.info("starting listener process")
p = Process(target=listener, args=(eventq, logq))
p.start()
p.join()
ありがとうございました。私はqueuelistenerを使用しているレシピの1つに従っています。ハンドラをQueueHandlerに置き換えたいので、ハンドラに直接割り当てています。 addHandlerを使用すると、既存のハンドラがまだ存在し、各ログメッセージが繰り返されることになります。上記のコードで、get_serverの後にsys.stdout.flush()を追加すると、ログメッセージが正しく出力されますが、その理由はわかりません。 – simon