Весь мой код записывает журнал через say() в sys.stderr и перенаправляет ошибку. На многопоточном сервере я хочу, чтобы каждый поток записывался в отдельный файл журнала. Могу ли я сделать это, не переписывая весь код, используемый потоками?
from threading import Thread
from time import sleep
def say(*args):
print(*args, file=sys.stderr)
def worker(num):
for _ in range(5):
say("worker", num, "working")
sleep(.1)
for num in range(4):
Thread(target=worker, args=(num,)).start()
Вывод смешанный, цель состоит в том, чтобы перенаправить его в другой файл журнала для каждого потока:
worker 0 working
worker 1 working
worker 2 working
worker 3 working
worker 0 working
worker 1 working
worker 3 working
worker 2 working
. . .
Насколько я понимаю, если я попытаюсь перенаправить stderr в файл внутри потока, перенаправление будет общим для всех потоков:
def worker(num):
sys.stderr = open('worker{}.log'.format(num), 'w')
for _ in range(5):
say("worker", num, "working")
Результат, как и ожидалось:
$ cat worker3.log
worker 1 working
worker 1 working
worker 1 working
worker 3 working
worker 3 working
worker 3 working
worker 3 working
worker 3 working
Обновления
@Amber, у меня уже есть уникальный идентификатор, и я могу использовать его как имя темы:
def say(*args, end='\n'):
print(currentThread().getName(), *args, file=sys.stderr, end=end)
sys.stderr.flush()
t_worker = Thread(name=str(num), target=worker, args=(num,))
Я не могу динамически выбирать файл журнала для каждого потока, потому что say() является глобальным — мне нужно либо поместить семафор в это глобальное хранилище файлов журнала, либо передать объект журнала каждой отдельной функции, которая регистрирует ход выполнения.