Вы должны быть в состоянии использовать пакет ведения журнала stdlib для этого. Вместо того, чтобы напрямую соединять вывод подпроцесса с файлом, вы можете сделать что-то вроде этого:
import logging
logger = logging.getLogger('foo')
def stream_reader(stream):
while True:
line = stream.readline()
logger.debug('%s', line.strip())
Это просто регистрирует каждую строку, полученную из потока, и вы можете настроить ведение журнала с RotatingFileHandler
, который обеспечивает ротацию файла журнала. Затем вы соглашаетесь прочитать эти данные и записать их в журнал.
foo_proc = subprocess.Popen(['foo'], stderr=subprocess.PIPE)
thread = threading.Thread(target=stream_reader, args=(foo_proc.stderr,))
thread.setDaemon(True) # optional
thread.start()
# do other stuff
thread.join() # await thread termination (optional for daemons)
Конечно, вы также можете позвонить stream_reader(foo_proc.stderr)
, но я предполагаю, что у вас может быть другая работа, пока подпроцесс foo делает свое дело.
Вот один способ настроить ведение журнала (код, который должен выполняться только один раз):
import logging, logging.handlers
handler = logging.handlers.RotatingFileHandler('/tmp/foo.log', 'a', 100000, 10)
logging.getLogger().addHandler(handler)
logging.getLogger('foo').setLevel(logging.DEBUG)
Это создаст до 10 файлов размером 100 КБ с именем foo.log (и после поворота foo.log.1, foo.log.2 и т. Д., Где foo.log является последним). Вы также можете передать 1000000, 1, чтобы получить только foo.log и foo.log.1, где поворот происходит, когда размер файла превышает 1000000 байт.