Avoiding console prints by Libvirt Qemu python APIs

Question:

I am trying to check if a domain exists by using the libvirt python API “lookupbyname()“. If the domain does not exist, it prints an error message on the console saying “Domain not found“.
I need the errors or logs only in syslog. I have tried redirecting stderr and stdout. But, it doesn’t have any effect. I have also tried playing around with the libvirt logging settings described in https://libvirt.org/logging.html . No effect again. “stdio_handler” flag in /etc/libvirt/qemu.conf is set to “file” as well.

Following is my test code:

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__

Output:

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

Is there a way to avoid this console print?

Asked By: Swaru

||

Answers:

This is a historical design mistake of libvirt, which we unfortunately can’t remove without breaking back-compat for apps relying in this mis-feature. So you need to manually turn off printing to console using

def libvirt_callback(userdata, err):
    pass

libvirt.registerErrorHandler(f=libvirt_callback, ctx=None)
Answered By: DanielB

A lambda version of Danielb’s answer

libvirt.registerErrorHandler(lambda userdata, err: None, ctx=None)
Answered By: user3747797
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.