2011-09-03 1 views
2

Я хочу сделать так, чтобы вывод «stdout» и «stderr» из «check_call()» отправляется в Syslog. Это возможно?Функция печати Выход в Syslog?

Код:

def command(cmd, err=None, ifexit=False): 
    try: 
     check_call(shlex.split(cmd), stdout=null, stderr=null) 

    except CalledProcessError: 
     if err != None: 
      print err 

     if ifexit == True: 
      exit(1) 

ответ

2

Да, это возможно, но я думаю, что вам нужно будет использовать Popen вместо check_call и отправить процесс stdout и stderr к правильной настройке регистратора. Такой регистратор использовал бы logging.handlers.SysLogHandler для отправки сообщений на ваш сервер syslog. Вот краткий пример того, как можно было бы создать такой регистратор:

import logging 

handler = logging.handlers.SysLogHandler() 
logger = logging.getLogger('myApplication') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

А вот пример того, как вы могли бы заменить check_call с Popen и отправить данные в регистраторе:

process = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE) 
# Popen.wait() waits for the command to complete and 
# returns the command's return code 
if process.wait() != 0: 
    print "AN ERROR OCCURED" 
logger.error(process.stderr) 
logger.info(process.stdout) 
+0

Хорошо, но как мне получить Popen, чтобы сказать мне, успешно ли выполнена команда? – Soviero

+0

@ Kevin просто проверьте значение ['process.returncode'] (http://docs.python.org/library/subprocess.html?highlight=subprocess#subprocess.Popen.returncode) или используйте' process.wait() 'метод. Я обновил свой ответ, чтобы дождаться завершения команды и проверить, успешно ли она выполнена. – MatToufoutu

1

I натолкнулся на это в 2017 году, поэтому я подумал, что было бы неплохо продолжить и обновить это для Python 3, поскольку решение нуждается в небольшой модификации. Для того, чтобы иметь возможность использовать SysLogHandler в Python 3, вам придется настроить код следующим образом:

import logging 
import logging.handlers as handlers 

handler = handlers.SysLogHandler(address='/dev/log') 
logger = logging.getLogger('myApplication') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

Как подробные here, SysLogHandler класс

Возвращает новый экземпляр класса SysLogHandler предназначенный для связи с удаленной машиной Unix, адрес которой задается по адресу в виде кортежа (хоста, порта). Если адрес не указан, используется («localhost», 514). Адрес используется для открытия сокета. Альтернативой предоставлению кортежа (хоста, порта) является предоставление адреса в виде строки, например '/ dev/log'. В этом случае для отправки сообщения в syslog используется сокет домена Unix.