Рассмотрим следующий фрагмент:
import logging
import logging.config
from multiprocessing import Process, set_start_method
try:
set_start_method('spawn')
except RuntimeError:
pass
def log(logger):
for _ in range(10):
logger.info('FLAG2')
if __name__ == '__main__':
config = {
"version": 1,
"formatters": {
"timestamp": {
"format": "%(asctime)s: %(message)s"
},
},
"handlers": {
"stdout": {
"level": "INFO",
"formatter": "timestamp",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
},
},
"loggers": {
"some_logger": {
"level": "INFO",
"handlers": ["stdout"]
}
}
}
logging.config.dictConfig(config)
logger = logging.getLogger("some_logger")
for _ in range(10):
logger.info('FLAG1')
p = Process(target=log, args=(logger,))
p.start()
p.join()
Это напечатает FLAG1
десять раз, включая метки времени, FLAG2
не будет записано в стандартный вывод.Если я удаляю вызов set_start_method('spawn')
, отображаются и FLAG1
, и FLAG2
, и я предполагаю, что это происходит из-за того, что порожденному потоку не хватает какой-то глобальной конфигурации регистратора, созданной dictConfig
.Тем не менее, есть ли способ передать регистратор в порожденный поток и сохранить то же поведение в журнале без необходимости передавать словарь конфигурации регистратора?