In fact, libvirt print job progress to stderr, check print_job_progress() in virsh-domain.c:

print_job_progress(const char *label, unsigned long long remaining,
                   unsigned long long total)
{
......
    /* see comments in vshError about why we must flush */
    fflush(stdout);
    fprintf(stderr, "\r%s: [%3d %%]", label, progress);
    fflush(stderr);