2017-06-13 70 views
1

我的问题是:Python日志配置不能使用配置文件和多处理。Logging dictConfig不支持多处理

我正在使用python2.7。

这里我example.py

import json 
import logging 
import logging.config 
import multiprocessing 


def get_logger(): 
    with open("logging.conf") as fd: 
     config_json_obj = json.load(fd) 
    #logging.config.dictConfig(config_json_obj) 
    logging.basicConfig(filename="my.log", level=logging.INFO) 
    logger = logging.getLogger(__name__) 
    return logger 

def funSquare(num): 
    logger = get_logger() 
    # write logging info from process 
    logger.info(num ** 2) 
    return num ** 2 


if __name__ == '__main__': 
    logger = get_logger() 

    logger.info("Start program") 
    pool = multiprocessing.Pool() 
    results = pool.map(funSquare, range(10)) 
    print(results) 

在这里,我logging.conf文件:

{ 
    "version": 1, 
    "formatters": 
    { 
    "simple": 
    { 
     "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s" 
    }, 
    "verbose": 
    { 
     "format": "%(asctime)s %(thread)s %(levelname)s %(module)s [-] %(message)s" 
    } 
    }, 
    "handlers": 
    { 
    "console": 
    { 
     "class": "logging.StreamHandler", 
     "level": "DEBUG", 
     "formatter": "simple", 
     "stream": "ext://sys.stdout" 
    }, 
    "file": 
    { 
     "class": "logging.FileHandler", 
     "formatter": "verbose", 
     "level": "DEBUG", 
     "filename": "mylog.log" 
    } 
    }, 
    "loggers": 
    { 
    "Main": 
    { 
     "level": "INFO", 
     "handlers": ["console", "file"], 
     "propagate": 0 
    } 
    }, 
    "root": 
    { 
    "level": "DEBUG", 
    "handlers": ["file"] 
    } 
} 

在这一点上,example.py工作。您将从my.log文件中获取来自主程序和新程序的记录行。

重现我的问题

现在,如果我更换线路:

#logging.config.dictConfig(config_json_obj) 
logging.basicConfig(filename="my.log", level=logging.INFO) 

通过

logging.config.dictConfig(config_json_obj) 
#logging.basicConfig(filename="my.log", level=logging.INFO) 

在my.log文件,你会看到只有从主程序从伐木线,不流程。

现在我的问题:

  1. 为什么发生这种情况?
  2. 解决方案是什么?

谢谢你的帮助。

回答

1

问题是__name__将评估'__main__';你需要

  • 之一:在您的主文件

记录器logger = logging.getLogger('Main'):在您的配置文件重命名"Main""__main__"(用于记录器的名称)

  • 或(也许更稳健)你正在与logging.getLogger(__name__)得到没有另外配置。

  • +0

    hiro,谢谢,你的解决方案适合我。但是,您如何评价@Vinay的评论? – Lobo

    +1

    我完全同意他的评论。你将会遇到可能导致问题的竞争条件......队列是一个很好的解决方案!可能有其他人。这可能有助于https://docs.python.org/3/howto/logging-cookbook。html#从多个进程中登录到单个文件(查看作者是谁......) –

    2

    你不应该期望从多个进程写入单个文件来工作(它可能在某些情况下工作,但不能保证)。正确的方法是使用多处理Queue,并将所有文件写入由单个进程完成,如2010年的this blog post中所述(太长而无法在此处重现)。重要的是,每个进程在创建后配置日志。如果需要,可以修改链接的示例以使用dictConfig,而不是示例中显示的编程配置。