반응형

Process, Thread, Main 함수의 로그를 파일로 저장하는 logging Python  예제 코드입니다.

 

2022. 12. 25  최초작성



import logging
import logging.handlers
import multiprocessing
import threading


def listener_configurer():

    root = logging.getLogger()
    h = logging.handlers.RotatingFileHandler('log_test.txt', 'w', 0, 0)
    f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
    h.setFormatter(f)
    root.addHandler(h)

def listener_process(queue, configurer):
    configurer()
    while True:
        try:
            record = queue.get()
            if record is None
                break
            logger = logging.getLogger(record.name)
            logger.handle(record) 
        except Exception:
            import sys, traceback
            print('Whoops! Problem:', file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

def worker_configurer(queue):
    h = logging.handlers.QueueHandler(queue)
    root = logging.getLogger()
    root.addHandler(h)
    root.setLevel(logging.INFO)

def worker_thread(continent):
    logger = logging.getLogger('[worker_thread]')

    for i in range(100):
        logger.log(logging.INFO, f'print {continent} {i}')

def worker_process(continent,queue,worker_configurer):
    worker_configurer(queue)
    logger = logging.getLogger('[worker_process]')

    for i in range(100):
        logger.log(logging.INFO, f'print {continent} {i}')


if __name__ == "__main__"

    queue = multiprocessing.Queue(-1)
    listener = multiprocessing.Process(target=listener_process,
                                      args=(queue, listener_configurer))
    listener.start()

    names = ['America', 'Europe', 'Africa']


    # 프로세스는 따로 사용합니다.
    procs = []
    for name in names:
        proc = multiprocessing.Process(target=worker_process, args=(name,queue,worker_configurer))
        procs.append(proc)
        proc.start()


    # main 함수와 스레드가 공유합니다.
    worker_configurer(queue)
    logger = logging.getLogger('[main]')

    lp = threading.Thread(target=worker_thread, args=('Earth',))
    lp.start()

    for i in range(200):
        logger.log(logging.INFO, f'main {i}')

    for proc in procs:
        proc.join()

    queue.put_nowait(None)
    listener.join()
    lp.join()



원본 코드 

https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes 

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts