Избегание печати консоли с помощью API Libvirt Qemu python

Я пытаюсь проверить, существует ли домен, используя API libvirt python "lookupbyname()". Если домен не существует, на консоли выводится сообщение об ошибке «Домен не найден». Мне нужны ошибки или журналы только в системном журнале. Я попытался перенаправить stderr и stdout. Но это не имеет никакого эффекта. Я также пробовал играть с настройками ведения журнала libvirt, описанными в https://libvirt.org/logging.html . Эффекта опять нет. Флаг «stdio_handler» в /etc/libvirt/qemu.conf также установлен в «файл».

Ниже приведен мой тестовый код:

import os, sys
import libvirt
conn = libvirt.open('qemu:///system')

# Find the application in the virsh domain
try:
    sys.stdout = open(os.devnull, "w")
    sys.stderr = open(os.devnull, "w")
    dom = conn.lookupByName('abcd')
    sys.stdout = sys.__stdout__
    sys.stderr = sys.__stderr__
except Exception as e:
    syslog.syslog (syslog.LOG_ERR, 'Could not find the domain. ERROR: %s.' % (e))
    sys.stdout = sys.__stdout__
    sys.stderr = sys.__stderr__

Выход:

$ python test.py
libvirt: QEMU Driver error : Domain not found: no domain with matching name 'abcd'
$

Есть ли способ избежать этой консольной печати?


person Swaru    schedule 07.08.2017    source источник


Ответы (1)


Это историческая ошибка проектирования libvirt, которую мы, к сожалению, не можем устранить, не нарушив обратную совместимость для приложений, использующих эту функцию. Поэтому вам нужно вручную отключить печать на консоль, используя

def libvirt_callback(userdata, err):
    pass

libvirt.registerErrorHandler(f=libvirt_callback, ctx=None)
person DanielB    schedule 07.08.2017
comment
Я манипулировал похожими проблемами для поиска в сети и других API-интерфейсов libvirt python. Это решает все подобные проблемы. Благодарю вас! - person Swaru; 07.08.2017