

同一のアプリケーション内で複数のマルチプロセスを立ち上げ、並列性のある動作をさせる必要があります。  
しかし、外部から見ると、ひとつのアプリケーションなので、ログはひとつにまとめ時系列に記述さえたいと思います。  
プロセスごとに異なるメモリ空間となるため、それぞれの子プロセス内で、setLoggerを同じ設定で行う必要があります。  
以下にサンプルコードを記述します。

起動させると特に問題なくログが記述され、ファイルもローテーションされます。

このような使用方法で正しいのでしょうか？

[code]

    import os
    import time
    import pathlib
    
    import logging
    import logging.handlers
    
    from queue import Empty
    from multiprocessing import Process, Queue
    from multiprocessing import freeze_support,set_start_method
    
    def setLogger(log_name:str,path:str,level:str,file_size:int,file_count:int):
    
        logging.basicConfig(format='%(asctime)s %(threadName)s %(levelname)s:%(message)s')
        formatter = logging.Formatter('%(asctime)s %(threadName)s %(levelname)s:%(message)s')
    
        ret_path = os.path.split(path)
        ret = pathlib.Path(ret_path[0]).mkdir(parents=True,
                                            exist_ok=True)
    
        hLog =logging.handlers.RotatingFileHandler(path,'a',maxBytes=file_size,backupCount=file_count)
        hLog.setFormatter(formatter)
        logger = logging.getLogger(log_name)
        logger.setLevel(level)
        logger.addHandler(hLog)
    
        return logger
    
    class SubProcess():
        def run(self,Name,log_name:str,path:str,level:str,file_size:int,file_count:int):
            alog = setLogger(
                log_name = log_name,
                path = path,
                level = level,
                file_size = file_size,
                file_count = file_count,
            )
    
            s = [Name for _ in range(1000)]
            s = ''.join(s)
    
            while(True):
                time.sleep(0.1)
    
                alog.info('{}:{}'.format(Name,s))
    
    
    if __name__ == '__main__':
        freeze_support()
        set_start_method('spawn')
    
        log_size = 1*1024*1024
        log_files = 2
        log_name = 'app'
        log_level = 'INFO'
    
        current_path = os.getcwd()
        log_path_app = current_path + '\\log\\applog.log'
    
        alog = setLogger(
            log_name = log_name,
            path = log_path_app,
            level = log_level,
            file_size = log_size,
            file_count = log_files,
        )
    
        instSub1 = SubProcess()
    
        instSub1Pro = Process(
            target=instSub1.run,
            args =('Sub1',log_name,log_path_app,log_level,log_size,log_files),
            )
        instSub1Pro.start()
    
        instSub2 = SubProcess()
    
        instSub2Pro = Process(
            target=instSub2.run,
            args =('Sub2',log_name,log_path_app,log_level,log_size,log_files),
            )
        instSub2Pro.start()
    
        s = ['####' for _ in range(1000)]
        s = ''.join(s)
    
        while(True):
            time.sleep(0.1)
    
            alog.info('MainProcess:{}'.format(s))
    
    
    
    
[/code]


CC BY-SA 4.0
2020-12-18T10:41:28.057
72745
2020-12-18T10:41:28.057
32891
question
python logging python-multiprocessing
Python マルチプロセスで同じログファイルにログを書き出すときの注意点はありますか